REST-API-05-Sync-Await

修正之前的一个错误

nodemon 用于开发时,代码修改后,自动重启服务
修改 package.json, 删除 dependencies 下的 nodemon
安装为dev dependencies

1
$ npm install nodemon --save-dev

package.json

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
{
"name": "APIProject",
"version": "1.0.0",
"description": "",
"main": "app.js",
"scripts": {
"start": "nodemon app.js",
"test": "echo \"Error: no test specified\" && exit 1"
},
"keywords": [],
"author": "1623695606@qq.com",
"license": "ISC",
"dependencies": {
"body-parser": "^1.17.2",
"express": "^4.15.4",
"mongoose": "^4.11.7",
"morgan": "^1.8.2"
},
"devDependencies": {
"nodemon": "^1.11.0"
}
}

Sync-Await 用法

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
//controllers/users.js 片段
const User = require('../models/user')
module.exports = {
index: async (req,res,next) => {
//Async-Await 方式
try {
const users = await User.find();
res.status(200).json(users);
} catch (error) {
next(error);
}
},
newUser: async (req,res,next) => {
try{
const newUser = new User(req.body);
const user = await newUser.save();
res.status(200).json(user);
console.debug('save ' ,user);
}catch(err){
next(err);
}
}
}
```
## 安装
express-promise-router , 可以不用写 try catch
```bash
$ npm install express-promise-router

修改 routers/users.js , 配置使用 express-promise-router

1
2
3
4
5
6
7
8
const express = require('express');
//const router = express.Router();
const router = require('express-promise-router')();
const userController = require('../controllers/users');
router.route('/')
.get(userController.index)
.post(userController.newUser);
module.exports = router;

验证try cach 能捕获 错误,修改 routers/users.js

1
2
3
4
5
6
7
8
9
10
11
//routers/users.js代码片段
index: async (req,res,next) => {
//Async-Await 方式
try {
const users = await User.find();
throw new Error('Dummy error !');
res.status(200).json(users);
} catch (error) {
next(error);
}
}

在 app.js 中,最后一个中间件,将错误捕获

1
2
3
4
5
6
7
8
9
10
11
12
13
//app.js 代码片段
//Error handler function
app.use((err,req,res,next) => {
//Response to client
const error = app.get('env') === 'development' ? err : {};
const status = err.status || 500;
//Reponse to ourselves
res.status(status).json({
error:{
message: error.message
}
});
});

在postman get /user 的结果

1
{"error":{"message":"Dummy error !"}}

去除 routers/users.js 中的try catch 如下

1
2
3
4
5
6
7
8
9
//...
index: async (req,res,next) => {
//Async-Await 方式
const users = await User.find();
throw new Error('Dummy error !'); //仍旧能捕获错误
res.status(200).json(users);
//没有写next(err)
}
//...

附代码
https://github.com/monk8/expressjs-rest-api-server/tree/lesson05

视频教程
https://www.bilibili.com/video/av11683622/#page=5