在现代 Web 开发中,RESTful API(Representational State Transfer)已经成为了最常见的 API 设计风格,它通过 URI(统一资源标识符)来表示资源,并利用 HTTP 协议中的各种方法(POST、GET、PUT、DELETE 等)来操作这些资源。而 MongoDB 则是一款非关系型数据库,它以 JSON 格式存储数据,并支持分布式部署和自动化的横向扩展。在 RESTful API 的实现中,常常会使用 MongoDB 作为后端数据库,本文将介绍如何利用 Node.js 和 Express 构建 RESTful API,并使用 MongoDB 存储资源数据。
环境准备
在开始之前,请确保你已经安装了以下软件:
创建项目
首先,我们需要创建一个 Node.js 项目,可以通过以下命令进行初始化:
mkdir restful-api-mongodb cd restful-api-mongodb npm init -y
安装依赖
在项目中,我们需要使用以下两个 Node.js 模块:
可以使用以下命令进行安装:
npm install express mongoose
编写代码
配置数据库连接
在使用 MongoDB 之前,需要先连接数据库。在项目的根目录下创建一个名为 db.js
的文件,并添加以下代码:
-- -------------------- ---- ------- ----- -------- - -------------------- ----------------------------------------------------------- - ---------------- ----- ------------------- ----- ----------------- ------ --------------- ----- --- ------------------------------ -- -- - ---------------------- -- ----------- --- ------------------------------- ------- -- - ---------------------- -------- ------- --- -------------- - ---------
上述代码中,我们使用 Mongoose 连接到本地的 MongoDB 数据库,并设置了一些选项,例如使用新的 URL 解析器、统一的拓扑结构等等。在连接成功或者失败的时候,会输出相应的信息。最后,将连接对象导出。
定义数据模型
在 MongoDB 中,数据由一组文档(document)组成,每个文档可以包含不同的属性,并且不需要事先定义模式。然而,在构建 RESTful API 中,我们通常需要遵循一定的数据结构,以便于客户端能够正确地解析和使用返回的数据。因此,我们可以使用 Mongoose 来定义数据模型,并将其映射到 MongoDB 的集合(collection)中。
在项目的根目录下创建一个名为 models.js
的文件,并添加以下代码:
-- -------------------- ---- ------- ----- -------- - ---------------- ----- ---------- - --- ---------------- - ------ - ----- ------- --------- ---- -- ------- - ----- ------- --------- ---- -- ------------ - ----- ------ -- ---------- - ----- ----- -------- -------- -- ---------- - ----- ----- -------- -------- -- -- - ----------- ----- - -- ----- ---- - ---------------------- ------------ -------------- - - ---- --
上述代码中,我们定义了一个名为 Book
的模型,该模型由 title
、author
、description
、createdAt
和 updatedAt
等属性组成,其中 title
和 author
是必须存在的。我们还为模型指定了一个名为 books
的集合,并设置了一些选项,例如不需要 _id
和 __v
属性等等。最后,将模型导出。
处理 HTTP 请求
在 RESTful API 中,通常有四种基本的 HTTP 方法:
- GET:获取资源。
- POST:创建资源。
- PUT:更新资源。
- DELETE:删除资源。
因此,我们需要编写相应的路由和处理函数来处理这些请求。在项目的根目录下创建一个名为 routes.js
的文件,并添加以下代码:
-- -------------------- ---- ------- ----- ------- - ------------------- ----- - ---- - - -------------------- ----- ------ - ----------------- -------------------- ----- ----- ---- ----- -- - --- - ----- ----- - ----- ------------ ---------------- - ----- ----- - ---------- - --- ------------------------ ----- ----- ---- ----- -- - --- - ----- - -- - - ----------- ----- ---- - ----- ------------------ -- ------- - ------ -------------------------- --- --------- - --------------- - ----- ----- - ---------- - --- --------------------- ----- ----- ---- ----- -- - --- - ----- - ------ ------- ----------- - - --------- ----- ---- - --- ------ ------ ------- ----------- --- ----- ------------ --------------- - ----- ----- - ---------- - --- ------------------------ ----- ----- ---- ----- -- - --- - ----- - -- - - ----------- ----- - ------ ------- ----------- - - --------- ----- ---- - ----- ---------------------- - ---- -- -- - ----- - ------ ------- ------------ ---------- --- ------ - -- - ---- ---- - -- -- ------- - ------ -------------------------- --- --------- - --------------- - ----- ----- - ---------- - --- --------------------------- ----- ----- ---- ----- -- - --- - ----- - -- - - ----------- ----- ---- - ----- ----------------------- ---- -- --- -- ------- - ------ -------------------------- --- --------- - --------------- - ----- ----- - ---------- - --- -------------- - -------
上述代码中,我们使用 Express 定义了一个路由器,并为 /books
路径下的不同请求方法分别定义了相应的处理函数。例如,在 GET 方法中,我们使用模型的 find
方法获取所有图书信息,并返回 JSON 格式的数据。在 POST 方法中,我们从请求体中解析出标题、作者和描述等信息,并创建一个新的图书对象。在 PUT 方法中,我们根据 ID 更新已有的图书对象。在 DELETE 方法中,我们将根据 ID 删除相应的图书对象。
启动服务
最后,在项目的根目录下创建一个名为 index.js
的文件,并添加以下代码:
-- -------------------- ---- ------- ----- ------- - ------------------- ----- ---------- - ----------------------- ----- ------ - -------------------- ----- --- - ---------- ----- ---- - ---------------- -- ----- ------------------------------- --------- ----- ---- --------------------------- --------------- -------- ---------------- -- -- - ------------------- --------- -- --------------------------- ---
上述代码中,我们使用 Express 创建了一个应用程序,定义了 HTTP 请求体解析中间件和路由器,并监听端口以开始服务。
测试 API
可以使用 Postman 或者 curl 等工具来测试 API。例如,在 GET 方法中,可以请求 http://localhost:3000/api/books
,输出如下所示的 JSON 格式的数据:
-- -------------------- ---- ------- - - ------ --------------------------- -------- ----- --- --------- ------- --- -------------- ------------ --- ------------ --------------------------- ------------ -------------------------- -- - ------ --------------------------- -------- ----- --- --------- ------- --- -------------- --- ------------ --------------------------- ------------ -------------------------- - -
在 POST 方法中,可以向 http://localhost:3000/api/books
发送以下数据:
{ "title": "Book C", "author": "Author C", "description": "Description C" }
返回相应的 JSON 格式的数据,例如:
{ "_id": "60c129d5bdd7d643cc77a656", "title": "Book C", "author": "Author C", "description": "Description C", "createdAt": "2021-06-09T04:44:53.219Z", "updatedAt": "2021-06-09T04:44:53.219Z" }
在 PUT 方法中,可以向 http://localhost:3000/api/books/:id
发送 PUT 请求,其中 :id
为要更新的图书 ID,并附带以下数据:
{ "title": "Book C (updated)", "author": "Author C (updated)", "description": "Description C (updated)" }
返回相应的 JSON 格式的数据,例如:
{ "_id": "60c129d5bdd7d643cc77a656", "title": "Book C (updated)", "author": "Author C (updated)", "description": "Description C (updated)", "createdAt": "2021-06-09T04:44:53.219Z", "updatedAt": "2021-06-09T04:45:26.012Z" }
在 DELETE 方法中,可以向 http://localhost:3000/api/books/:id
发送 DELETE 请求,其中 :id
为要删除的图书 ID,返回相应的 JSON 格式的数据,例如:
{ "_id": "60c129d5bdd7d643cc77a656", "title": "Book C (updated)", "author": "Author C (updated)", "description": "Description C (updated)", "createdAt": "2021-06-09T04:44:53.219Z", "updatedAt": "2021-06-09T04:45:26.012Z" }
总结
在本文中,我们了解了如何使用 Node.js 和 Express 构建 RESTful API,并使用 MongoDB 存储数据。通过定义数据模型和处理 HTTP 请求,我们可以创建基本的 CRUD(增删改查)操作,并使用 Postman 等工具进行测试。当然,还有很多其他的功能需要实现,例如分页、过滤和排序等等,但本文的代码已经足够演示如何使用 MongoDB 存储数据和创建基本的 API。希望这篇文章能够对你有所帮助。
来源:JavaScript中文网 ,转载请注明来源 https://www.javascriptcn.com/post/646b6510968c7c53b0ab8621