使用node.js、Express、Mongobd在10分钟内构建RESTful API
一、什么是REST?
REST是代表状态转移的首字母缩写。它是Web标准体系结构和HTTP协议。REST体系结构样式描述了Roy Fielding在其博士论文中最初传达的六个约束,并将RESTful样式的基础定义为:
- 统一界面
- 无状态
- 可缓存的
- 客服服务器模式
- 分层系统
- 按需编码(可选)
RESTful应用程序使用HTTP请求执行称为CRUD的四个操作(C:创建,R:读取,U:更新和D:删除)。创建和/或更新用于发布数据,获取以读取/列出数据以及删除以删除数据。
RESTful由以下方法组成:基本网址,网址,媒体类型等。
在本教程中,我们将学习如何使用Node.js创建RESTful API。
二、工具:
- Node.js
- MongoDB
- 编辑器(Atom,Sublime,Visual Studio Code,Vim)
- postman或apipost
三、入门
就本教程而言,我将通过创建RESTful API来帮助您。为此,我们将创建一个RESTful待办事项列表API(即将创建任务,获取或读取所有任务列表,读取特定任务,删除任务并更新任务的端点)。
假设条件
我假设您已经设置了环境(即已安装Node.js和MongoDB),让我们从以下基本步骤开始本教程。
打开您的终端,请按照以下步骤操作
-
创建一个文件夹名称todoListApi
mkdir todoListApi -
导航到新创建的文件夹的根目录
cd todoListApi -
创建一个package.json文件
npm init
Package.json是一个文件,它向npm提供必要的信息,使它可以识别项目并处理项目的依赖项。
npm init会提示您输入一些信息,例如应用程序名称,描述,版本,作者,关键字,并询问您看到的内容是否令人满意。
您最终应该拥有类似的东西。 -
创建一个名为server.js 的文件
touch server.js
在此服务器中,我们将编写协议来创建服务器。 -
创建一个名为api的文件夹
mkdir api
在此名为api的文件夹中,通过运行以下命令创建三个单独的文件夹,分别名为model,routes和controllers
cd api
mkdir controllers
mkdir models
mkdir routes -
在api / controller文件夹中创建todoListController.js,在routes文件夹中创建todoListRoutes.js,在model文件夹中创建todoListModel
touch api/controllers/todoListController.js api/models/todoListModel.js api/routes/todoListRoutes.js
现在,我们的文件夹结构应如下所示:
服务器设置
让我们安装express和nodmon,express将用于创建服务器,而nodmon将通过监视更改的文件并自动重启服务器来帮助我们跟踪应用程序的更改。
npm install --save-dev nodemon
npm install express --save
- 打开server.js文件,然后在其中键入/复制以下代码
//引入express模块
const express = require('express')
//实例化名字为app的express
const app = express()
//设置代表端口的port常量并赋值3000
const port = 3000
//开始监听,成功后输出Example app listening on 端口号
app.listen(port, () => console.log(`Example app listening on port ${port}!`))
-
在终端上,运行npm run start此命令将启动服务器,然后您将看到Example app listening on 3000
npm run start -
终端上,运行npm install mongoose --save命令安装mongoose。Mongoose是我们将用来与MongoDB(Database)实例进行交互的对象。
npm install mongoose --save -
安装后,打开api / models文件夹中的todoListModel.js文件,然后在文件中键入以下代码并保存。
//引入mongoose
const mongoose = require('mongoose');
//声明一个叫Schema的架构
const Schema = mongoose.Schema;
//定义TaskSchema的架构
const TaskSchema = new Schema({
name: {
type: String,
required: 'Kindly enter the name of the task'
},
Created_date: {
type: Date,
default: Date.now
},
status: {
type: [{
type: String,
enum: ['pending', 'ongoing', 'completed']
}],
default: ['pending']
}
});
//导出一个叫Tasks模型
module.exports = mongoose.model('Tasks', TaskSchema);
从上面的代码中,我们需要在文件中使用Mongoose,然后定义框架最后导出一个模型。模型是用来构造文档的类。
Oracle | MongoDB | Mongoose |
---|---|---|
数据库实例(database instance) | MongoDB实例 | Mongoose |
模式(schema) | 数据库(database) | mongoose |
表(table) | 集合(collection) | 框架(Schema)+模型(Model) |
行(row) | 文档(document) | 实例(instance) |
rowid | _id | _id |
Join | DBRef | DBRef |
任务集合(表)包含名称,其创建日期,任务状态
设置路由
路由是指确定应用程序如何响应客户端对特定端点的请求,该特定端点是URI(或路径)和特定的HTTP请求方法(GET,POST等)。
我们的每条路由都有不同的功能,这些功能在匹配相应路由时执行。
下面我们用不同的方法定义了两条基本路由(“ / tasks”和“ / tasks / taskId”),
“ / tasks”必须使用方法(“ GET”和“ POST”),而“ / tasks / taskId”具有GET ,PUT和DELETE。
在这里我们使用控制器,这样可以使得每个route方法都可以调用其各自的处理函数。
为此,请打开route文件夹中的todoListRoutes.js文件,并将下面的代码片段粘贴进去
//引入mongoose
const mongoose = require('mongoose'),
//实例化一个名字叫Task的模型
Task = mongoose.model('Tasks');
//导出一个叫list_all_tasks的方法,用于查询所有list中的内容
exports.list_all_tasks = function (req, res) {
Task.find({}, function (err, task) {
if (err)
res.send(err);
res.json(task);
});
};
//导出一个叫create_a_task的方法,用于新建一个task
exports.create_a_task = function (req, res) {
var new_task = new Task(req.body);
new_task.save(function (err, task) {
if (err)
res.send(err);
res.json(task);
});
};
//导出一个叫read_a_task的方法,用于读取一个task
exports.read_a_task = function (req, res) {
Task.findById(req.params.taskId, function (err, task) {
if (err)
res.send(err);
res.json(task);
});
};
//导出一个叫update_a_task的方法,用于更新一个task
exports.update_a_task = function (req, res) {
Task.findOneAndUpdate({_id: req.params.taskId}, req.body, {new: true}, function (err, task) {
if (err)
res.send(err);
res.json(task);
});
};
//导出一个叫delete_a_task的方法,用于删除一个task
exports.delete_a_task = function (req, res) {
Task.remove({
_id: req.params.taskId
}, function (err, task) {
if (err)
res.send(err);
res.json({message: 'Task successfully deleted'});
});
};
把他们组合在一起
早些时候,在server.js文件中,我们只启动并运行服务器。
在本节中,我们将把处理程序(控制器),数据库,创建的模型,主体解析器和创建的路由连接在一起。
打开之前创建的server.js文件,然后按照以下步骤将所有内容放在一起。
本质上,您将用本节中的代码片段替换server.js中的代码。
我们将会进行如下几步操作:
- 通过将URL添加到mongoose实例,完成连接数据库的操作
- 加载创建的Tasks模型
- 安装bodyParser并使用
bodyParser用于处理程序之前,在中间件中对传入的请求体进行解析。
body-parser 提供四种解析器- JSON body parser
- Raw body parser
- Text body parser
- URL-encoded form body parser
- 在服务器中注册我们创建的路由
- 安装nodemon然后启动服务器
建议全局安装,使用命令
npm install -g nodemon
之后在终端根目录运行nodemon server.js
//引入express模块
express = require('express')
//引入mongoose模块
mongoose = require('mongoose')
//引入bodyParser模块
bodyParser = require('body-parser');
//引入todoListModel模块
Task = require('./api/models/todoListModel')
//引入路由模块
routes = require('./api/routes/todoListRoutes')
//实例化名字为app的express
const app = express()
//设置代表端口的port常量并赋值3000
const port = 3000
//开始监听,成功后输出Example app listening on 端口号
app.listen(port, () => console.log(`Example app listening on port ${port}!`))
//连接MongoDB数据库
mongoose.connect('mongodb://localhost/Tododb',{useNewUrlParser:true,useUnifiedTopology:true});
//调用bodyParser中间件
app.use(bodyParser.json());
app.use(bodyParser.urlencoded({ extended: true }));
//注册路由
routes(app);
通过ApiPost进行测试
现在一切都已准备好了,让我们开始测试。
增加一条记录
打开ApiPost在其中输入地址
http://localhost:3000/tasks
使用POST方法,选择application/x-www-form-urlencoded。在Body中添加数据。参数名为name,参数值为随意起个名字就行。之后点击发送按钮。即可在下方看到返回值。
查看所有记录
地址不变将POST方法改为GET方法。直接点击发送按钮。查看返回值。其余的不在此一一测试。
4.结束语
感谢原作者Olatunde Michael Garuba。本文改编自https://www.codementor.io/@olatundegaruba/nodejs-restful-apis-in-10-minutes-q0sgsfhbd
大家可以去查看原版。由于库版本不同因此与原版存在一定差异。