可重用 API 流行的最大原因是 API 允许使用来自 Web 客户端、移动应用程序、桌面应用程序的数据,实际上是任何客户端。将构建一个基于 Nodejs,由 MongoDB 数据驱动的强大而灵活的 GraphQL API,并支持 Swagger 文档。
本文基于《Nodejs、GraphQL、MongoDB、Hapi 和 Swagger 构建 API(一)》的MongoDB数据库部分。
项目代码仓库:github.com/QuintionTan…
创建 Models
在开始创建数据模型之前,先把上面连接数据库的代码稍微整理一下,将其封装到一个文件中,创建文件名 mongoConns.js
,代码如下:
const mongoose = require("mongoose"); class MongoConns { constructor() { this.getMainDB = this.getMainDB.bind(this); const mongoUrl = "mongodb://127.0.0.1:27018/powerful"; this.mainDB = mongoose.createConnection(mongoUrl, { useNewUrlParser: true, useCreateIndex: true, useUnifiedTopology: true, }); this.mainDB .then((db) => { console.info("Connected to MongoDB mainDB"); }) .catch((err) => { console.error("Failed to connect to mainDB", { params: { err: err.message }, }); }); } getMainDB() { return this.mainDB; } } let mongoConns = null; module.exports = () => { if (mongoConns) return mongoConns; else { mongoConns = new MongoConns(); return mongoConns; } };
对于 MongoDB,遵循模型约定,接下来进行数据建模。这是一个相对简单的概念,将能够掌握。基本上,只是为集合声明对应的模式。可以将 MongoDB 的集合视为 SQL 数据库中的表。
在项目根目录下创建文件夹 models
,在文件夹 models
中创建数据模型文件 Painting.js
,代码如下:
const mongoose = require("mongoose"); const Schema = mongoose.Schema; const mongoConns = require("../mongoConns")(); const PaintingSchema = new Schema({ name: { type: String, }, url: { type: String, }, techniques: { type: [String], }, }); module.exports = mongoConns.getMainDB().model("Painting", PaintingSchema);
- 需要 mongoose 依赖
- 引入数据库连接并初始化 mongoConns
- 通过调用 mongoose 架构构造函数并传入选项来声明
PaintingSchema
。注意它是如何强类型化的:例如,定义了name
字段可以由一个字符串组成,而techniques
由一个字符串数组组成。 - 导出模型并将其命名为
Painting
增加新的路由
理想情况下,希望 URL 端点反映相应的操作。例如 /api/v1/paintings
或者 /api/v1/paintings/{id}
等等。
从 GET
和 POST
路由开始。 GET
获取所有 Painting
,POST 添加新的 Painting
。
回到根目录文件 server.js
,添加两个新的路由代码:
const API_ENDPOINT = "/api/v1"; const init = async () => { server.route( { method: "GET", path: "/", handler: (request, response) => `<h1>This is powerful api.</h1>`, }, { method: "GET", path: `${API_ENDPOINT}/paintings`, handler: (req, reply) => { return Painting.find(); }, }, { method: "POST", path: `${API_ENDPOINT}/paintings`, handler: (req, reply) => { const { name, url, techniques } = req.payload; const painting = new Painting({ name, url, techniques, }); return painting.save(); }, } ); await server.start(); console.log(`Server running at:${server.info.uri}`); };
请注意,将路由修改为对象数组而不是单个对象,还使用了箭头函数。
- 为
/api/v1/paintings
路径创建了一个 GET 路由。在处理程序中,mongoose schema 方法 find(),它将返回所有记录,因为这里没有没有传递任何条件来查找。 - 还为
/api/v1/paintings
路径创建了一个 POST 路由。这样的API设计将遵循 REST 约定。
在浏览器中输入 http://localhost:3006/api/v1/paintings
,将在页面上看到一个空数组。
接下来调试 POST 的接口,需要按照工具 Postmain,下载安装好。
打开 Postmain ,创建一个POST 请求。
配置好参数,点击发送,看到响应如下:
至此一个新的记录已经创建了,可以去数据库中查看。或者返回浏览器刷新 http://localhost:3006/api/v1/paintings
,可以看到如下数据:
至此一个读取、写入接口完成了。