npm 包 express-restify-mongoose-patch 使用教程

阅读时长 14 分钟读完

简介

express-restify-mongoose-patch 是一个 Node.js 的 npm 包,用于快速构建 RESTful API。它是 express-restify-mongoose 的增强版,提供了更多功能和更简洁的 API。本文将介绍如何使用 express-restify-mongoose-patch 构建 RESTful API,以及如何使用其提供的各种功能。

安装

在使用 express-restify-mongoose-patch 之前,需要确保已经安装了 Node.js 环境,并在项目中安装 express 和 mongoose。安装命令如下:

基础使用

express-restify-mongoose-patch 提供了一个 restify 方法,用于快速构建 RESTful API。通过在 mongoose schema 中定义资源的字段,即可轻松生成 RESTful API。下面是一个简单的例子:

-- -------------------- ---- -------
----- ------- - -------------------
----- -------- - --------------------
----- ------- - ------------------------------------------

---------------------------------------------

----- --- - ----------

----- ------------ - --- -----------------
  ----- -
    ----- -------
    --------- ----
  --
  ---- -
    ----- -------
    --------- ----
  -
---

------------------ ------------------------ ---------------

-----------------

以上代码定义了一个名为 Person 的 mongoose model,包含 name 和 age 两个字段。通过调用 restify.serve 方法,将 Person model 以 RESTful API 的形式暴露出来,供客户端访问。

其中,restify.serve 方法有三个参数:

  • app:express 实例。
  • model:mongoose model。
  • options:可选参数,用于配置 API 的行为。

我们在这里省略 options 参数,使用默认配置。options 参数的详细介绍将在后面的章节中提供。

现在,我们已经完成了一个非常简单的 RESTful API。以下是对该 API 的说明:

  • GET /people:获取所有 person 的列表。
  • GET /people/:id:根据 id 获取指定的 person。
  • POST /people:新增 person,请求体中应包含 name 和 age 字段。
  • PUT /people/:id:根据 id 更新指定的 person,请求体中应包含要更新的字段。
  • DELETE /people/:id:根据 id 删除指定的 person。

配置选项

restify.serve 的第三个参数,即 options,默认配置如下:

-- -------------------- ---- -------
-
  ------- ---
  -------- ---
  ----------- ------
  --------- ---
  ------------ ----
  ------------------ ------
  ----- -----
  ----------------- ------
  ----------------- ------
  -------------- ---
  --------------- ---
  ------- -----
  --------- -----
  ----------------- ----------------
  ----------- ------
  ---------- ------
  ------------ ------
  ---------- ------
  ----------- -----
  ---------- -----
  ------------ ---
  ------------ ---
  ------------------ -----
  ------------------ -----
  ------- -----
  --------- -----
  --------------- -----
  ------- -----
  ------- -----
  -------------- -----
  --------------- -----
  ------------ ---
  ------------ -----
  ------------- ------
  ---------------------- ------
  --------------------- ------
  -------------------- ------
  ------------ -----
-

下面对其中一些常用的选项进行介绍。

prefix

指定 API 的前缀。默认为空。

pageSize

每页的数据条数。默认为 10。

maxPageSize

每页最大的数据条数。默认为 100。

lean

返回的对象是否是普通的 JavaScript 对象。默认为 true,表示返回普通的 JavaScript 对象。如果为 false,表示返回 mongoose document 对象。

access

控制 API 的访问权限。access 可以是一个布尔值或一个函数。如果 access 是一个函数,则函数返回值表示是否有权限访问 API。函数有两个参数:req 和 doc。req 表示当前的请求,doc 表示要访问的资源。如果 access 是一个布尔值,则表示所有用户可以访问 API。

outputFn

自定义输出函数。outputFn 可以是一个函数或一个对象。如果 outputFn 是一个函数,则函数返回值表示要输出的数据。函数有一个参数:doc,表示要输出的资源。如果 outputFn 是一个对象,则对象的 format 属性表示自定义输出函数,filter 属性表示要过滤的属性。

-- -------------------- ---- -------
-------- ------------- -
  ----- ---- - -
    ----- ---------
    ---- -------
  --
  ------ -----
-

------------------ ------------------------ -------------- -
  --------- --------
---

excludeProjection

从返回结果中排除的字段名数组。默认为空数组。

高级用法

除了基础使用之外,express-restify-mongoose-patch 还提供了很多高级用法。下面将逐一进行介绍。

聚合查询

如果需要在 API 中支持聚合查询,可以使用 restify.query() 方法。restify.query() 提供类似 MongoDB 的聚合查询语法,支持 match、group、sort、project 等操作。

-- -------------------- ---- -------
----- ------- - -------------------
----- -------- - --------------------
----- ------- - ------------------------------------------

---------------------------------------------

----- --- - ----------

----- ------------ - --- -----------------
  ----- -
    ----- -------
    --------- ----
  --
  ---- -
    ----- -------
    --------- ----
  --
  ------- -
    ----- -------
    --------- ----
  --
  ----- -
    ----- -------
    --------- ----
  --
  ------- -
    ----- -------
    --------- ----
  -
---

------------------ ------------------------ -------------- -
  ------- -----
  -------------- -----------------
---

-----------------

以上代码定义了一个包含 name、age、gender、city 和 salary 五个字段的 Person model。通过在配置中指定 preMiddleware: [restify.query()],即可开启聚合查询功能。下面是一些聚合查询的例子:

  • GET /people?match={"gender":"male"}&group={"_id":null,"count":{"$sum":1}}:获取所有男性的人数。
  • GET /people?match={"gender":"female","age":{"$gt":30},"salary":{"$gt":5000}}&sort={"age":1}&project={"name":1,"gender":1,"age":1}:获取所有女性中年龄大于 30,薪资大于 5000 的人,按照年龄升序排列,只返回 name、gender 和 age 三个字段。

自定义路由

如果需要在 API 中添加自定义路由,可以使用 restify.defaults() 方法。restify.defaults() 用于配置 API 路由的前缀、版本号等信息。可以设置多次,每次设置都会增加前缀、版本号等信息。下面是一个例子:

-- -------------------- ---- -------
------------------
  ------- -------
  -------- ----
---

------------------
  ------- -----
---

------------------ ------------------------ ---------------

以上代码设置了两次 restify.defaults(),第一次设置 API 前缀为 /api,版本号为 v1;第二次设置 API 前缀为 /v1,版本号不变。最终的 API 路由为 /api/v1/v1/people。

除了使用 restify.defaults(),还可以使用 restify.router() 方法,自定义 API 路由。restify.router() 接收一个函数作为参数,该函数返回一个 express router 实例,可以在里面定义自己的路由。

以上代码使用 restify.router() 定义了一个名为 /custom-route 的路由,返回一个字符串 Hello, world!。由于 restify.router() 返回的是一个 express router 实例,因此需要把实例传递给 restify.serve() 才能生效。

自定义操作

如果需要在 API 中添加自定义操作,可以使用 restify.methods() 方法。restify.methods() 支持自定义 GET、POST、PUT 和 DELETE 四种操作,并且支持中间件。下面是一个例子:

-- -------------------- ---- -------
----------------------- ------ ---------- -
  -------------------- ---- ----- -- -
    -- ----------------- --- ------ -
      ------ -------- ------------- ----------
    -
    -------
  ---
  ----------------- ---- ----- -- -
    -- ---
  ---
  ----------------- ---- ----- -- -
    -- ---
  ---
  -------------------- ---- ----- -- -
    -- ---
  --
---

------------------ ------------------------ ---------------

以上代码定义了一个包含 GET、PUT 和 DELETE 三个操作的自定义操作。在操作之前,先添加一个中间件,用于校验请求参数中的 secret 值。如果 secret 不是 abc,则返回一个错误。使用 restify.methods() 添加 GET、PUT 和 DELETE 三个操作,每个操作都对应一个处理函数。在运行时,可以使用类似 /people/123?secret=abc 的 URL 访问这个自定义操作。

自定义响应

如果需要在 API 中自定义响应,可以使用 restify.outputFn() 方法。restify.outputFn() 接收一个函数作为参数,该函数返回要输出的数据。可以在函数中自定义数据的格式、过滤等操作。

-- -------------------- ---- -------
---------------------- ---- ----- -- -
  ----- ------ - ---
  ----------------- - ----------------
  ------------- - ---------------------- -- --
    ----- ------------
    ---- ----------
  ----
  ------ -------
---

------------------ ------------------------ ---------------

以上代码使用 restify.outputFn() 定义了一个自定义输出函数,只返回 name 和 age 两个字段。在函数中,先定义了一个对象 output,包含了 totalCount 和 people 两个字段。在处理数据时,只选择了 name 和 age 两个字段,输出的数据格式经过了自定义。

插件扩展

如果需要在 API 中添加插件扩展,可以使用 restify.use() 方法,类似于 express 的中间件。restify.use() 支持多种插件扩展,包括分页、排序、筛选等。下面是一个例子:

-- -------------------- ---- -------
----- ----------- - ------------------------

----------------- ---- ----- -- -
  ----- ----- - ----------------------------------------
  -------------- - ------------------ -- --
  --------------- - ------------------- -- ---
  -------
---

------------------ ------------------------ ---------------

以上代码使用 restify.use() 添加了一个插件扩展,用于解析查询参数中的 page 和 limit,设置默认值。通过 req.query.page 和 req.query.limit 可以得到解析后的值。

总结

express-restify-mongoose-patch 提供了一种快速构建 RESTful API 的方式,避免了繁琐的 CRUD 操作。本文介绍了 express-restify-mongoose-patch 的基础用法和高级用法,包括聚合查询、自定义路由、自定义操作、自定义响应和插件扩展等。希望能够帮助读者更好地使用 express-restify-mongoose-patch。

来源:JavaScript中文网 ,转载请注明来源 https://www.javascriptcn.com/post/6005524081e8991b448cfc97

纠错
反馈