REST-API-10-Cars-Routes-Start

注意 User 和 Car 的 关联映射关系。
实现 2个 cars api

方法 路径 描述
GET /cars lists all cars
POST /cars creates a new car

models/car.js

1
2
3
4
5
6
7
8
9
10
11
12
13
14
//models/car.js
const mongoose = require('mongoose');
const Schema = mongoose.Schema;
const carSchema = new Schema({
make:String,
model:String,
year:Number,
seller:{
type:Schema.Types.ObjectId,
ref:'user'
}
});
const Car = mongoose.model('car',carSchema);
module.exports = Car;

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
//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);
}
}

routers/cars.js

1
2
3
4
5
6
7
8
9
//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.newCarSchema), carController.newCar);
module.exports = router;

helpers/routerHelpers.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
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
//helpers/routerHelpers.js
const Joi = require('joi');
module.exports = {
validateParam:(schema,name) => {
return (req,res,next) => {
// console.log('req.params',req.params);
//var foo = {[name]:req['params'][name]};
//var foo = {name:'dd'};
//console.log('foo',foo);
const result = Joi.validate({[name]: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']= result.value;
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({
userId:Joi.string().regex(/^[0-9a-fA-F]{24}$/).required()
}),
carSchema: Joi.object().keys({
make: Joi.string().required(),
model: Joi.string().required(),
year: Joi.number().required()
}),
newCarSchema: 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()
})
}
}
const idSchema = Joi.object().keys({
userId:Joi.string().regex(/^[0-9a-fA-F]{24}$/).required()
});

代码

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

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