构建API非常有趣!特别是当您可以利用Koa,GraphQL和MongoDB等现代技术时。
Koa是一个Node框架,就像Express是一个Node框架一样。我们将用Koa替换Express,因为Koa在回调时使用async / await语法。
入门
构建API的先决条件如下:
- 节点安装
- 文本编辑器; 我选择Visual Studio Code
- 终奌站
- 浏览器
如果您拥有所需的一切,请继续 - 如果没有,请安装它们。
打开终端并创建一个节点项目,如下所示: 15573815950021.jpg到目前为止,我们创建了项目文件夹,并初始化了一个新的Node项目。现在我们有了可用的NPM软件包,可用于安装Koa,Mongo和GraphQL。
让我们安装koaNPM。
npm i koa
启动一个新的Koa服务器非常简单。我们需要的只是一个server.js
文件,其内容如下:
const Koa = require('koa');
const app = new Koa();
app.listen(9000);
app.on('error', err => {
log.error('server error', err)
});
使用Node启动项目:
15573816496082.jpg
安装GraphQL
我们需要两个软件包来使用Koa设置GraphQL:koa-mount和koa-graphql
npm i koa-mount koa-graphql
15573816781488.jpg
15573816850846.jpg
GraphQL要求我们将初始模式传递给GraphQL服务器。让我们创建一个。
我们将把graphQL架构放在 graphql/schema.js
const { buildSchema } = require('graphql');
const schema = buildSchema(`
type Query {
hello: String
}
`);
module.exports = schema;
我们将我们的初始函数传递Query
给buildSchema
函数
注意:请注意该参数的参数buildSchema
是模板文字。如果不熟悉,我建议你看一下这篇文章。
现在我们可以将初始模式传递给GraphQL服务器。
app.use(mount('/graphql', graphqlHTTP({
schema: schema,
graphiql: true
})))
别忘了导入koa-mount
,koa-graphql
最后是schema.js
。
const mount = require('koa-mount');
const graphqlHTTP = require('koa-graphql');
const schema = require('./graphql/schema');
然后,如果我们前往localhost:9000/graphql
:
初始设置完成。它还不是很有用。理想情况下,我们想查询GraphQL以将数据保存到我们的mongodb并从那里读取。
设置MongoDB
为了使用GraphQL进行读写,我们需要一个可以读取的地方。这就是Mongo派上用场的地方。我们将从那里保存并读取我们的数据。
为了简单起见,我们将为Mongo使用云实例。前往mlab.com并创建用户和mongo数据库。
创建mongoDB数据库
创建数据库后,您将需要数据库的用户。
创建MongoDB用户
现在您可以使用与Mongoose配对的mongoDB。您的数据库的远程URL将是这样的:
mongodb://:@ds213615.mlab.com:13615/koa-graphql
安装mongoose
npm i mongoose
创建database.js文件
我们为数据库连接创建一个专用文件。
const mongoose = require('mongoose');
const initDB = () => {
mongoose.connect(
'mongodb://indrek:graphql1@ds213615.mlab.com:13615/koa-graphql',
{ useNewUrlParser: true }
);
mongoose.connection.once('open', () => {
console.log('connected to database');
});
}
module.exports = initDB;
注意:确保使用数据库的用户名和凭据。
这段代码将尝试连接到远程mongodb。我们现在需要在某处调用它。
打开server.js
并require
调用initDB
方法。
const initDB = require(' ./database ');
initDB();
如果我们正确地完成了所有工作,我们的控制台应该告诉我们我
15573821320252.jpg
请注意不断刷新服务器有多烦人?让我们用一个名为的包来解决这个问题pm2
。
PM2是具有内置负载均衡器的Node.js应用程序的生产过程管理器。它允许您永久保持应用程序活动,在不停机的情况下重新加载应用程序,并促进常见的系统管理任务。
添加一个调用start我们的脚本package.json:
"scripts": {
"start": "pm2 start server.js"
},
15573821891475.jpg
Pm2
在后台运行,这释放了我们的终端。如果您想要停止该过程,请运行pm2 kill
。现在我们不必一直重启服务器,pm2自动完成。
注意:pm2 logs将控制台日志语句返回给终端。
MongoDB模型
如果你曾经使用过Mongo,你就知道mongoDB可以让我们为我们的数据创建模型。这是我们构建数据外观的简洁方法。
创建文件夹模型并在文件内gadgets.js
输入:
const mongoose = require('mongoose');
const Schema = mongoose.Schema;
/*
notice there is no ID. That's because Mongoose will assign
an ID by default to all schemas
*/
const GadgetSchema = new Schema({
name: String,
release_date: Date,
by_company: String,
price: Number,
});
module.exports = mongoose.model('Gadget', GadgetSchema);
注意:我们的架构中没有ID字段。那是因为Mongoose
默认会为所有模式分配一个ID。
大。我们还添加一个集合和一些虚拟数据。gadgets在这种情况下,集合名称必须将我们的args名称映射为复数形式。
15573822600003.jpg创建集合后,以JSON格式插入文档,如下所示:
15573822695160.jpg
这就是Mongo的全部。让我们用GraphQL获取数据。
GraphQL查询
GraphQL也要求我们创建类型。把它想象成计算机的指令。
graphql/gadgetType.js
const graphql = require('graphql');
const { GraphQLObjectType, GraphQLString } = graphql;
const GadgetType = new GraphQLObjectType({
name: 'Gadget',
fields: () => ({
})
});
module.exports = GadgetType;
注意我们创建了一个graphql类型。在字段内,我们可以指定给定类型的属性。
const graphql = require('graphql');
const { GraphQLObjectType, GraphQLObjectType } = graphql;
const GadgetType = new GraphQLObjectType({
name: 'Gadget',
fields: () => ({
id: { type: GraphQLString },
name: { type: GraphQLString },
release_date: { type: GraphQLString },
by_company: { type: GraphQLString },
price: { type: GraphQLString }
})
});
module.exports = GadgetType;
注意我们从graphQL中解构的GraphQLObjectType
和GraphQLObjectType
类型。这些是graphQL的原始类型。
创建graphQL类型也会授予我们在创建查询时使用的类型提示。
我们需要做的最后一件事是重构我们的schema.js
。我们想通过查询argsid。
导入Gadget模型,gadgetGraphQLTypegraphql
类型和GraphQLSchema
,GraphQLObjectType
,GraphQLString
从graphQL
到schema.js
。
onst { GraphQLSchema,GraphQLObjectType,GraphQLString } = require(' graphql ');
const gadgetGraphQLType = require(' ./gadgetType ');
const Gadget = require(' ../models/gadget ');
接下来我们需要一个根查询。每个GraphQL
查询都以大括号开头{}:
const RootQuery = new GraphQLObjectType({
name: 'RootQueryType',
fields: {
}
})
瞧!在字段内,我们可以指定gadget
查询。
const RootQuery = new GraphQLObjectType({
name: 'RootQueryType',
fields: {
gadget: {
type: gadgetGraphQLType,
args: { id: { type: GraphQLString }},
resolve(parent, args) {
return Gadget.findById(args.id)
}
}
}
})
请注意args查询中的三个属性:
- type -
gadgetGraphQLType
在这种情况下,这是查询的类型。 - args - 我们可以为
graphql
查询提供参数,例如:gadgets(id: "1")
- 解决 - 我们如何解决查询?一旦进行查询,应该怎么办?这里我们按id 返回Gadget 模型。
最后导出它。
module.exports = new GraphQLSchema({
query: RootQuery
});
文件schema.js
文件应如下所示:
const { GraphQLSchema, GraphQLObjectType, GraphQLString} = require('graphql');
const gadgetGraphQLType = require('./gadgetType');
const Gadget = require('../models/gadget');
const RootQuery = new GraphQLObjectType({
name: 'RootQueryType',
fields: {
gadget: {
type: gadgetGraphQLType,
args: { id: { type: GraphQLString }},
resolve(parent, args) {
return Gadget.findById(args.id)
}
}
}
})
module.exports = new GraphQLSchema({
query: RootQuery
});
现在转到http:// localhost:9000 / graphql
并进行查询。
{
gadget(id: "5c4e188efb6fc05326ad9264") {
name
price
by_company
release_date
id
}
}
这就是我们应该最终得到的!
15573824944085.jpg到目前为止,我们可以读取我们的数据,但我们很有可能需要编辑我们的数据记录/文档。任何完整的数据平台都需要一种修改服务器端数据的方法。
其他章节
如何使用GraphQL,Koa和MongoDB设置功能强大的API(一)
如何使用GraphQL,Koa和MongoDB设置功能强大的API(二)
如何使用GraphQL,Koa和MongoDB设置功能强大的API(三)
网友评论