尝试使用Node.js + express + MongoDB创建WebAPI

用于软件

Node.js v8.9.1
Express 4.16.0
MongoDB v4.0.5
mongoose 5.4.7
body-parser 1.18.3

Node.js版本为v8.9.1
Express版本为4.16.0
MongoDB版本为v4.0.5
mongoose版本为5.4.7
body-parser版本为1.18.3

前提 tí)

我已经使用Node.js和express实现了一个简单的WebAPI。

Node.js和Express的准备工作

参考这篇文章,在Node.js和express上创建可用的WebAPI。
使用Node.js和express创建一个简单的WebAPI。

准备MongoDB

下载MongoDB的安装程序。

MongoDB有云版本和服务器版本可用,但这次我想要在本地使用数据库,所以我会下载服务器版本。
我准备下载MongoDB社区版。

安装MongoDB

只需运行安装程序,并按照向导进行安装即可。
在中途会询问是否要安装MongoDB服务,选择默认选项,以网络服务用户身份执行设置。

WS000095.JPG

設置 MongoDB 的路徑

设置系统环境变量

在Windows系统的环境变量Path中添加以下路径。

WS000101.JPG

确认MongoDB的路径是否设置正确

重启Windows,并在命令提示符中执行以下命令。

mongo --verion

当显示出MongoDB的版本时,表示路径已经设置正确。

MongoDB配置

根据需要修改MongoDB的设置。
设置可在MongoDB的安装目录\bin\mongod.cfg中进行。
如果要更改数据库存储位置,请修改storage.dbPath;如果要更改日志文件的输出路径,请修改systemLog.path。

默认情况下,storage.dbPath和systemLog.path都指向Windows的Proglem Files目录下,但由于该目录是只读的,导致MongoDB启动失败。
因此,需要在C盘等位置创建data文件夹和log文件夹,并将mongod.cfg文件中的路径更改为使用这些文件夹。

# mongod.conf

# for documentation of all options, see:
#   http://docs.mongodb.org/manual/reference/configuration-options/

# Where and how to store data.
storage:
  dbPath: C:\mongo\data
  journal:
    enabled: true
#  engine:
#  mmapv1:
#  wiredTiger:

# where to write logging data.
systemLog:
  destination: file
  logAppend: true
  path:  C:\mongo\log\mongod.log

# network interfaces
net:
  port: 27017
  bindIp: 127.0.0.1


#processManagement:

#security:

#operationProfiling:

#replication:

#sharding:

## Enterprise-Only Options:

#auditLog:

#snmp:

MongoDB的启动和关闭

通过Windows服务显示“MongoDB”,点击“开始”按钮来启动MongoDB作为服务。

WS000103.JPG

在关闭MongoDB时,同样可以通过点击“停止”按钮来停止MongoDB的服务。

默认情况下,启动类型设置为“自动”,因此MongoDB服务会在Windows启动时开始运行。

使用命令提示符与MongoDB建立连接。

通过输入下面的命令,可以连接到MongoDB并以对话形式操作MongoDB。

mongo

MongoDB的基本操作

MongoDB的数据结构

MongoDB的数据结构大致如下。

WS000105.JPG

与一般的关系型数据库管理系统的表和记录不同,MongoDB使用集合和文档来保持数据。

RDBMSMongoDBデータベースデータベーステーブルコレクションレコードドキュメント

查看数据库列表

在命令提示符中输入命令”mongo”以连接到MongoDB,并在与MongoDB的交互模式下输入命令”show dbs”。

> show dbs
admin   0.000GB
config  0.000GB
local   0.000GB

默认情况下,预先创建了三个数据库,包括admin、config和local。

切换使用的数据库

切换数据库时,请输入命令“use [要使用的数据库名称]”。

> use local
switched to db local

查看收藏列表

当想查看数据库下的集合列表时,只需输入”show collections”命令。

> show collections
startup_log

查看收藏夹中的文件

如果想查看集合中的文档,请输入命令db.[集合名称].find()。
如果想查看startup_log集合中的文档,则可使用以下命令。

> db.startup_log.find();

创建数据库

如果您想创建一个新的数据库,请输入命令“use [要创建的数据库名称]”。
虽然切换使用数据库的命令与此相同,但如果数据库名称不存在,系统会自动创建数据库。

> use sampledb
switched to db sampledb

添加收藏

要将集合添加到数据库中,首先使用`use [数据库名]`选择数据库,然后输入`db.createCollection(‘[集合名]’)`这个命令。

> db.createCollection('test_collection')
{ "ok" : 1 }

添加文件

要向集合中添加文档,需要在选择了数据库的情况下,使用 [数据库名] 来选择具有添加文档的集合,并输入 db.[集合名].insert(); 这个命令来执行添加文档的操作。

> db.test_collection.insert({name:'hogehoge', age:20});
WriteResult({ "nInserted" : 1 })

查看在find中注册的文档的内容。

> db.test_collection.find();
{ "_id" : ObjectId("5c4aba1d3cfc6e2de3998745"), "name" : "hogehoge", "age" : 20 }

被随意添加的_id是一种叫做ObjectId的东西,将自动分配唯一的值。(相当于RDBMS的唯一键)

只需要一個選擇:關於此事言之過早。

MongoDB的文档没有像关系型数据库中的表定义一样的概念,只要是JSON格式的文档,无论其内部的树状结构如何,都可以被添加到集合中。
因此,我们可以在同一个集合中混合使用具有“sex”字段和不具有“sex”字段的文档。

> db.test_collection.insert({name:'taro', age:30, sex:'men'})
WriteResult({ "nInserted" : 1 })
> db.test_collection.find();
{ "_id" : ObjectId("5c4aba1d3cfc6e2de3998745"), "name" : "hogehoge", "age" : 20 }
{ "_id" : ObjectId("5c4abe533cfc6e2de3998746"), "name" : "taro", "age" : 30, "sex" : "men" }

使用Node.js+Express+Mongoose来利用MongoDB。

Mongoose是什么?

有一個稱為Mongoose的庫,可用於從Node.js訪問MongoDB,所以我們這次試試看使用它。
Mongoose使得像O/R Mapper那樣可以操作MongoDB的文檔,以對象結構進行操作。
有關O/R Mapper的概述,請參考以下頁面。
O/R Mapping的角色和優勢

安装Mongoose

npm install mongoose --save

我参考了以下页面关于Mongoose的内容。
从Node.js访问MongoDB(介绍Mongoose)。

使用 Mongoose 操纵 MongoDB

尝试在使用Express创建的WebAPI中添加保存文档到MongoDB的功能。
创建Express WebAPI的步骤可以参考以下的Qiita。
使用Node.js和Express创建一个简单的WebAPI。

需要使用body-parser来提取存储在POST请求的BODY中的信息,因此请使用以下npm命令进行安装。

npm install body-parser --save

模式定义

首先,定义表示MongoDB对象结构的架构。
本例中定义了一个名为User的架构,用于存储name和age。

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

const User = new Schema({
    name: String,
    age: Number
});

module.exports = mongoose.model('User', User);

使用WebAPI将文档保存到MongoDB

创建一个WebAPI

创建一个名为/api/v1/create-user的WebAPI,将接收到的POST请求的BODY参数保存到MongoDB中。
利用上述创建的名为User的模式定义,创建一个实例并进行保存操作,从而在MongoDB中创建一个文档。

const express = require('express');
const app = express();
const bodyParser = require('body-parser');
const mongoose = require('mongoose');
const User = require('./models/user');

mongoose.connect('mongodb://localhost/user');
app.use(bodyParser.urlencoded({extended:false}));
app.use(bodyParser.json());

// create-userの設定
app.post('/api/v1/create-user', (req, res) =>{
    if (!req.body){
        return res.status(500).send('reqest body empty.');
    }

    const instance = new User();
    instance.name = req.body.name;
    instance.age = req.body.age;
    // MongoDBに保存
    instance.save(function(err){
        if(!err) {
            return res.status(200).send('user create success.');
        } else {
            return res.status(500).send('user create faild.');
        }
    });
});

// イベント待機
app.listen(3000, () => console.log('Listening on port 3000'));

确认动作

使用以下命令启动Node服务器。

node index.js
WS000107.JPG

在MongoDB中创建了一个名为user的数据库,并在名为users的集合中添加了一个文档。
使用以下命令确认在MongoDB中添加了文档。

> use user
switched to db user
> db.users.find();
{ "_id" : ObjectId("5c4fdadbf326d40328e4e6b8"), "name" : "taro", "age" : 20, "__v" : 0 }

通过WebAPI从MongoDB中获取文档。

创造WebAPI

添加/api/v1/get-all-user。
使用find方法从用户数据库的users集合中获取所有文档。
将获取的文档直接作为响应返回。

const express = require('express');
const app = express();
const bodyParser = require('body-parser');
const mongoose = require('mongoose');
const User = require('./models/user');

mongoose.connect('mongodb://localhost/user');
app.use(bodyParser.urlencoded({extended:false}));
app.use(bodyParser.json());

// create-userの設定
app.post('/api/v1/create-user', (req, res) =>{
    if (!req.body){
        return res.status(500).send('reqest body empty.');
    }

    const instance = new User();
    instance.name = req.body.name;
    instance.age = req.body.age;
    // MongoDBに保存
    instance.save(function(err){
        if(!err) {
            return res.status(200).send('user create success.');
        } else {
            return res.status(500).send('user create faild.');
        }
    });
});

// get-all-userの設定
app.get('/api/v1/get-all-user', (req, res) =>{
    User.find(function(err, result){
        if(!err) {
            return res.json(result);
        } else {
            return res.status(500).send('get all user faild.');
        }
    });
});

// イベント待機
app.listen(3000, () => console.log('Listening on port 3000'));

确认动作

使用Chrome的ARC等工具发送HTTP请求,执行GET请求到WebAPI。

WS000108.JPG

可以从MongoDB中获取文档并将其放入WebAPI的请求中返回。

广告
将在 10 秒后关闭
bannerAds