REST-API-11-Cars-Routes-End

完成 Cars 剩余的 API

方法 路径 描述
GET /cars lists all cars
POST /cars creates a new car
GET /cars/:id lists particular car
PUT /cars/:id updates(by replacing)
PATCH /cars/:id updates(by patching fields)
DELETE /cars/:id delete

helpers/routerHelpers.js
今天还修正了一个问题,idSchema ,使用 param 做key,可以用来校验通用的id,在validateParam中做相应调整。

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
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
//helpers/routerHelpers.js
const Joi = require('joi');
module.exports = {
validateParam:(schema,name) => {
return (req,res,next) => {
const result = Joi.validate({param: req['params'][name]},schema);
if(result.error){
console.error(result.error);
return res.status(400).json(result.error);
}else{
if(!req.value){
req.value = {};
}
if(!req.value['params']){
req.value['params'] = {};
}
req.value['params'][name]= result.value.param;
next();
}
}
},
validateBody:(schema) =>{
return(req,res,next) => {
const result = Joi.validate(req.body,schema);
if(result.error){
console.error(result.error);
return res.status(400).json(result.error);
}else {
if(!req.value){
req.value = {}
}
if(!req.value['body']){
req.value['body'] = {};
}
req.value['body'] = result.value;
next();
}
}
},
schemas: {
userSchema:{
firstName: Joi.string().required(),
lastName:Joi.string().required(),
email:Joi.string().email().required()
},
userOptionalSchema:{
firstName: Joi.string(),
lastName:Joi.string(),
email:Joi.string().email()
},
idSchema: Joi.object().keys({
param:Joi.string().regex(/^[0-9a-fA-F]{24}$/).required()
}),
userCarSchema: Joi.object().keys({
make: Joi.string().required(),
model: Joi.string().required(),
year: Joi.number().required()
}),
carSchema: Joi.object().keys({
seller: Joi.string().regex(/^[0-9a-fA-F]{24}$/).required(),
make:Joi.string().required(),
model:Joi.string().required(),
year:Joi.number().required()
}),
putCarSchema: Joi.object().keys({
make:Joi.string().required(),
model:Joi.string().required(),
year:Joi.number().required()
}),
patchCarSchema: Joi.object().keys({
make:Joi.string(),
model:Joi.string(),
year:Joi.number()
})
}
}

routers/cars.js

1
2
3
4
5
6
7
8
9
10
11
12
13
14
//routers/cars.js
const express = require('express');
const router = require('express-promise-router')();
const carController = require('../controllers/cars');
const { validateParam, validateBody,schemas } = require('../helpers/routerHelpers');
router.route('/')
.get(carController.index)
.post(validateBody(schemas.carSchema), carController.newCar);
router.route('/:carId')
.get(validateParam(schemas.idSchema,'carId'), carController.getCar)
.put([validateParam(schemas.idSchema,'carId'),validateBody(schemas.putCarSchema)],carController.replaceCar)
.patch( [validateParam(schemas.idSchema,'carId'),validateBody(schemas.patchCarSchema)],carController.updateCar)
.delete(validateParam(schemas.idSchema, 'carId'),carController.deleteCar);
module.exports = router;

controllers/cars.js

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
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
//controllers/cars.js
const Car = require('../models/car');
const User = require('../models/user');
module.exports = {
index: async (req,res,next) => {
//Get all the cars!
const cars = await Car.find({}).populate('seller');
res.status(200).json(cars);
},
newCar: async (req,res,next) => {
// 1. Find the actual seller
const seller = await User.findById(req.body.seller);
// 2. Create a new car
const newCar = req.body;
delete newCar.seller;
const car = new Car(newCar);
car.seller = seller;
await car.save();
// 3. Add newly created car to the actual seller
seller.cars.push(car);
await seller.save();
// We're done!
res.status(200).json(car);
},
getCar : async (req,res,next) => {
const car = await Car.findById(req.value.params.carId);
res.status(200).json(car);
},
replaceCar: async (req,res,next) => {
const { carId } = req.value.params;
const newCar = req.value.body;
const car = await Car.findByIdAndUpdate(carId,newCar);
res.status(200).json({success:true});
},
updateCar: async (req,res,next) => {
const { carId } = req.value.params;
const newCar = req.value.body;
const car = await Car.findByIdAndUpdate(carId,newCar);
res.status(200).json({success:true});
},
deleteCar: async (req,res,next) => {
const car = await Car.findById(req.value.params.carId);
if(!car){
return res.status(404).json({message:'car does\'t exist! '});
}
const sellerId = car.seller;
const seller = await User.findById(sellerId);
seller.cars.pull(car);
await car.remove();
await seller.save();
res.status(200).json({success:true});
}
}

代码

https://github.com/monk8/expressjs-rest-api-server/tree/lesson11

参考
https://www.bilibili.com/video/av11683622/#page=11