用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

首先安装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

bannerAds