使用Express和MongoDB创建即席的RestAPI

要做的事情

使用Node.js的MVC框架Express和NoSQL数据库MongoDB来创建一个简单的RestAPI,可以进行用户信息的注册、修改和删除。
请求和响应以json格式进行(与NoSQL非常兼容)。
将MongoDB在Docker容器上启动。

図1.png

准备

在家里安装Homebrew和Node.js

在Docker上启动MongoDB。

在Docker容器上启动MongoDB。
虽然也可以直接安装,但既然有机会,就尝试使用Docker。

# Dockerインストール
$ brew install docker --cask

# MongoDBイメージ取得
$ docker pull mongo

# コンテナを作成して起動
# ホストOS側は27018ポート、コンテナ側は27017ポート(MongoDBのデフォルト)を使用
$ docker run -p 27018:27017 --name mongo-test -d mongo

创建Node.js项目

创建基础项目并进行环境构建。
因为认为Docker已经启动,所以启动一个新的终端。

# ディレクトリ作成
$ mkdir test-app

# 初期化処理(問合せ無しでpackage.json作成)
$ npm init -y

# 必要nodeモジュール(expressとmongoDB操作用モジュール)をインストール
$ npm install express mongoose

创建模型

定义一个作为基础用户模型的模式。

# ディレクトリ作成
$ mkdir server
$ cd server
$ mkdir models

# Model定義JavaScript作成
$ touch models/user.js

用VSCode或其他编辑器打开user.js文件进行编辑。
这里关键的Model有三个字段:唯一的ID、名字和年龄。

const mongoose = require('mongoose');
const Schema = mongoose.Schema;

const userSchema = new Schema({
  id: {
    type: String,
    required: true,
    unique: true
  },
  name: { type: String },
  age: { type: Number}
});

module.exports = mongoose.model('users', userSchema);

制作路由器和控制器

定義一个路由器来定义当实际收到HTTP请求时的行为,并定义一个控制器来控制整个过程,使用该模型。由于这是一个小规模的项目,因此将它们合并在一个名为server.js的文件中。

# ディレクトリ移動
$ cd ..

# Router&Controller定義JavaScript作成
$ touch server.js

打开server.js文件并在VSCode或其他编辑器中进行编辑。
假设HTTP请求将在3001端口上进行监听。
为了减少代码量,省略了除注册以外的错误处理。

const express = require('express');
const mongoose = require('mongoose');
const User = require('./models/user');

// DB接続
mongoose.connect('mongodb://localhost:27018/sampledb');

const app = express();
app.use(express.json({extended: true}));

// ユーザ情報登録
app.post('/users', (req, res) => {
  const user = new User(req.body);
  user.save((err, addedUser) => {
    if (err)
      return res.status(400).json({
        errorMessage: 'failed to add the user.'
      });
    res.send(addedUser);
  });
});

// ユーザ情報取得(全件)
app.get('/users', (req, res) => {
  User.find({}, (err, users) => {
    res.send(users);
  });
});

// ユーザ情報取得(ID指定)
app.get('/users/:id', (req, res) => {
  const params = req.params.id;
  User.find({id: params}, (err, user) => {
    res.send(user);
  });
});

// ユーザ情報削除(全件)
app.delete('/users', (req, res) => {
  User.remove({}, err => {
    res.send(true);
  });
});

// ユーザ情報削除(ID指定)
app.delete('/users/:id', (req, res) => {
  const params = req.params.id;
  User.remove({id: params}, (err, deletedUser) => {
    res.send(deletedUser);
  });
});

// ポート3001番でlisten
app.listen(3001, () => {
  console.log(`Server up on 3001`);
});

服务器启动

$ node server.js

确认动作(curl命令)

用curl命令尝试注册、获取和删除用户信息。
_id和__v是由MongoDB自动分配的字段,分别用作对象ID和版本管理。

# Allen登録
$ curl -X POST -H 'Content-Type:application/json' -d '{"id":"001","name":"Allen","age":20}' http://localhost:3001/users
# Allen登録結果
{"_id":"607bce198776e444bd55422b","id":"001","name":"Allen","age":20,"__v":0}%

# Yuki登録
$ curl -X POST -H 'Content-Type:application/json' -d '{"id":"002","name":"Yuki","age":26}' http://localhost:3001/users
# Yuki登録結果
{"_id":"607c3bf502ac68477a41ee10","id":"002","name":"Yuki","age":26,"__v":0}%

# 全件取得
$ curl -X GET http://localhost:3001/users
# 取得結果
[{"_id":"607bce198776e444bd55422b","id":"001","name":"Allen","age":20,"__v":0},{"_id":"607c3bf502ac68477a41ee10","id":"002","name":"Yuki","age":26,"__v":0}]%

# IDを指定して取得
$ curl -X GET http://localhost:3001/users/001
# 取得結果
[{"_id":"607bce198776e444bd55422b","id":"001","name":"Allen","age":20,"__v":0}]%

# IDを指定して削除
$ curl -X DELETE http://localhost:3001/users/001
# 削除結果
{"n":1,"ok":1,"deletedCount":1}%
# 削除確認のため全件取得
$ curl -X GET http://localhost:3001/users
# 残ってるのはYukiだけ
[{"_id":"607c3bf502ac68477a41ee10","id":"002","name":"Yuki","age":26,"__v":0}]%

# 全件削除
$ curl -X DELETE http://localhost:3001/users
# 削除結果
true%
# 削除確認のため全件取得
$ curl -X GET http://localhost:3001/users
# 何も残っていない
[]%

API 測試員

由于curl命令在视觉上不易理解,所以使用Chrome扩展程序Talend API Tester进行视觉确认。
在这里我们只确认注册和获取所有记录。

スクリーンショット 2021-04-18 23.11.02.png

接下来,假设Yuki以相同的方式进行注册,接下来是获取所有条目。

スクリーンショット 2021-04-18 23.13.43.png

就是这样确认了。
当然,通过改变方法也可以进行删除操作。
这样一来,就可以创建一个简单的RestAPI来操作数据库了。

作为应用,我想尝试做的事情。

    フロントエンドをReactとかで作りたい。
    今回DockerはMongoDBでしか使わなかったが、Node.jsそのものからDocker上で環境構築したい。VSCodeでDockerコンテナ上のワークスペースも編集できるらしい(参考)。
    TypeScriptで書けるようにしたい(参考)。

请提供参考网站。

React和Express的同步开发教程,专为初级JavaScript全栈工程师设计

通往MongoDB(Mongoose)高级使用者之路

使用curl命令进行操作

bannerAds