尝试使用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服务,选择默认选项,以网络服务用户身份执行设置。
設置 MongoDB 的路徑
设置系统环境变量
在Windows系统的环境变量Path中添加以下路径。
确认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作为服务。
在关闭MongoDB时,同样可以通过点击“停止”按钮来停止MongoDB的服务。
默认情况下,启动类型设置为“自动”,因此MongoDB服务会在Windows启动时开始运行。
使用命令提示符与MongoDB建立连接。
通过输入下面的命令,可以连接到MongoDB并以对话形式操作MongoDB。
mongo
MongoDB的基本操作
MongoDB的数据结构
MongoDB的数据结构大致如下。
与一般的关系型数据库管理系统的表和记录不同,MongoDB使用集合和文档来保持数据。
查看数据库列表
在命令提示符中输入命令”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
在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。
可以从MongoDB中获取文档并将其放入WebAPI的请求中返回。