Nodejs、GraphQL、MongoDB、Hapi 和 Swagger 构建 API(三)
可重用 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
,可以看到如下数据:
至此一个读取、写入接口完成了。
转载自:https://juejin.cn/post/7180708274302353465