用Express(Node.js)和MongoDB创建一个API,用于注册和获取人物个人资料
首先
使用Express作为Node.js的框架,创建一个可以注册和获取人物个人资料的REST API。
数据将使用MongoDB作为数据库。
环境
CentOS 7.5
Node.js 6.14.3
Express 4.16.0
MongoDB 3.6.7
准备
Node.js 6.14.3
Express 4.16.0
MongoDB 3.6.7
在编写代码之前,需要安装和设置必要的内容。
安装Node.js
首先安装Node.js。
# yum install nodejs npm --enablerepo=epel
我会创建一个名为new_project的项目。
# mkdir new_project
# cd new_project
使用 npm init 命令创建 package.json 文件。
由于采用对话形式进行创建,您需要根据自己的项目需求填写相应的内容。
# npm init
防火墙设置
将3000号端口开放。
# firewall-cmd --add-port=3000/tcp --zone=public --permanent
success
# firewall-cmd --reload
success
安装Express。
接下来,安装Express。
# npm install express --save
安装 MongoDB Node.JS 驱动程序
为了在Node.js中使用MongoDB,需要安装MongoDB Node.JS驱动程序。
# npm install --save mongodb
如果您尚未安装MongoDB,请根据官方文档的指引,安装适合您的环境的版本。
准备数据库
我将在Mongo Shell中创建数据库(mydb)和集合(person)。
开启Mongo Shell
# mongo
创建数据库
> use mydb
switched to db mydb
在这个阶段,由于还没有创建集合,因此执行 “show dbs” 命令时不会显示数据库列表。
创建收藏品
> db.createCollection('person');
{ "ok" : 1 }
> show collections
person
创建API
通过POST方法发送姓名和年龄,并将其添加到数据库中。
通过GET方法获取已注册个人的年龄。
const express = require("express");
const app = express();
// 待ち受け
const server = app.listen(3000, function(){
console.log("Node.js is listening to PORT:" + server.address().port);
});
// mongodb読み込み
const MongoClient = require("mongodb").MongoClient;
// 接続文字列
const dbUrl = "mongodb://localhost:27017/";
// データベース名
const dbName = 'mydb';
// postの処理
app.post("/api/test", (req, res) => {
// MongoDBへ接続
MongoClient.connect(dbUrl, {
useNewUrlParser: true
}, (err, client) => {
// コレクションの取得
const col = client.db(dbName).collection('person');
// コレクションにドキュメントを挿入
col.insertOne({
name: req.body.name, // POSTで送られてきたパラメータを取得
age: req.body.age
}, (error, result) => {
client.close();
});
});
res.send('POSTdata is sended.');
});
// getの処理
app.get("/api/test", (req, res) => {
// MongoDBへ接続
MongoClient.connect(dbUrl, {
useNewUrlParser: true
}, (err, client) => {
// コレクションの取得
const col = client.db(dbName).collection('person');
// ドキュメント取得
col.find({
name: req.query.name
}).toArray((error, documents) => {
for (let document of documents) {
res.send(document.age);
client.close();
}
});
});
});
如果在这里不指定”useNewUrlParser: true”,就会出现以下的警告。
目前的解析器将来将会被弃用。
(node:15513) DeprecationWarning: 当前 URL 字符串解析器已过时,并将在将来的版本中移除。要使用新的解析器,请在 MongoClient.connect 中传递选项 { useNewUrlParser: true }。
请参考以下链接:https://thanhphu.net/blog/2018/05/23/about-mongos-usenewurlparser-warning/
我会实际操作一下。
启动服务器。
# node app.js
Node.js is listening to PORT:3000
可以用中文进行原生的转述,只需要一种选项
为了反映app.js文件的更改内容,您需要每次重新启动服务器。因此,建议您安装一个名为nodemon的包。
# npm install -g nodemon
/* nodemon起動(# node app.jsの代わりに使います) */
# nodemon start
[nodemon] 1.18.4
[nodemon] to restart at any time, enter `rs`
[nodemon] watching: *.*
[nodemon] starting `node start app.js`
Node.js is listening to PORT:3000
[nodemon] restarting due to changes... // 変更があれば自動で再起動
[nodemon] starting `node start app.js`
Node.js is listening to PORT:3000
用curl进行POST请求
我要为山田先生注册20岁。
curl http://xxx.xxx.xxx.xxx:3000/api/test -X POST -d "name=Yamada&age=20"
在这里发表POST请求会出现以下错误。
类型错误:无法读取未定义的属性’name’
为了解决这个问题,将插入body-parser。
# npm install --save body-parser
在app.js中添加以下代码。
const bodyParser = require('body-parser');
app.use(bodyParser.urlencoded({extended: true}));
もう一度curlを実行するとPOSTが成功します。
mongoシェルを確認してみます。
> db.person.find();
{ "_id" : ObjectId("5b92375d7ab8243cdae7711e"), "name" : "Yamada", "age" : 20 }
ちゃんとドキュメントが追加されました。
用curl进行GET请求
次はGETで山田さんの年齢を取得してみます。
curl http://xxx.xxx.xxx.xxx:3000/api/test?name=Yamada
20
我已经达到了年龄要求。
请看以下内容
使用Node.js+Express+MongoDB构建REST API