我正在尝试创建一个模型 favorites.js 并用 user.js 和 disc.js 填充它,所以如果用户只使用该菜的 id 发布了最喜欢的菜,它还将存储用户和收藏夹列表该用户的。
这是我到目前为止所做的。因为我是新手,所以我的代码可能比我想象的有更多的问题。这是我最喜欢的模型和最喜欢的路由器;看看它们是如何填充的。
最爱路由器
const express = require('express');
const bodyParser = require('body-parser');
const mongoose = require('mongoose');
const authenticate = require('../authenticate');
const cors = require('./cors');
const Favourites = require('../models/favourite');
const favouriteRouter = express.Router();
favouriteRouter.use(bodyParser.json());
favouriteRouter.route('/')
.get(authenticate.verifyUser, (req, res, next) => {
Favourites.find({})
.populate('user')
.populate('dishes')
.then((favourites) => {
// extract favourites that match the req.user.id
if (favourites) {
user_favourites = favourites.filter(fav => fav.user._id.toString() === req.user.id.toString())[0];
if (!user_favourites) {
var err = new Error('You have no favourites!');
err.status = 404;
return next(err);
}
res.statusCode = 200;
res.setHeader("Content-Type", "application/json");
res.json(user_favourites);
} else {
var err = new Error('There are no favourites');
err.status = 404;
return next(err);
}
}, (err) => next(err))
.catch((err) => next(err));
})
.post(authenticate.verifyUser,(req, res, next) => {
Favourites.find({})
.populate('user')
.populate('dishes')
.then((favourites) => {
var user;
if (favourites)
user = favourites.filter(fav => fav.user._id.toString() === req.user.id.toString())[0];
if (!user)
user = new Favourites({ user: req.user.id });
for (let i of req.body) {
if (user.dishes.find((d_id) => {
if (d_id._id) {
return d_id._id.toString() === i._id.toString();
}
}))
continue;
user.dishes.push(i._id);
}
user.save()
.then((userFavs) => {
res.statusCode = 201;
res.setHeader("Content-Type", "application/json");
res.json(userFavs);
console.log("Favourites Created");
}, (err) => next(err))
.catch((err) => next(err));
})
.catch((err) => next(err));
})
.put(authenticate.verifyUser, (req, res, next) => {
res.statusCode = 403;
res.end('PUT operation is not supported on /favourites');
})
.delete(authenticate.verifyUser, (req, res, next) => {
Favourites.find({})
.populate('user')
.populate('dishes')
.then((favourites) => {
var favToRemove;
if (favourites) {
favToRemove = favourites.filter(fav => fav.user._id.toString() === req.user.id.toString())[0];
}
if (favToRemove) {
favToRemove.remove()
.then((result) => {
res.statusCode = 200;
res.setHeader("Content-Type", "application/json");
res.json(result);
}, (err) => next(err));
} else {
var err = new Error('You do not have any favourites');
err.status = 404;
return next(err);
}
}, (err) => next(err))
.catch((err) => next(err));
});
favouriteRouter.route('/:dishId')
.get(authenticate.verifyUser, (req, res, next) => {
Favourites.find({})
.populate('user')
.populate('dishes')
.then((favourites) => {
if (favourites) {
const favs = favourites.filter(fav => fav.user._id.toString() === req.user.id.toString())[0];
const dish = favs.dishes.filter(dish => dish.id === req.params.dishId)[0];
if (dish) {
res.statusCode = 200;
res.setHeader("Content-Type", "application/json");
res.json(dish);
} else {
var err = new Error('You do not have dish ' + req.params.dishId);
err.status = 404;
return next(err);
}
} else {
var err = new Error('You do not have any favourites');
err.status = 404;
return next(err);
}
}, (err) => next(err))
.catch((err) => next(err));
})
.post(authenticate.verifyUser,(req, res, next) => {
Favourites.find({})
.populate('user')
.populate('dishes')
.then((favourites) => {
var user;
if (favourites)
user = favourites.filter(fav => fav.user._id.toString() === req.user.id.toString())[0];
if (!user)
user = new Favourites({ user: req.user.id });
if (!user.dishes.find((d_id) => {
if (d_id._id)
return d_id._id.toString() === req.params.dishId.toString();
}))
user.dishes.push(req.params.dishId);
user.save()
.then((userFavs) => {
res.statusCode = 201;
res.setHeader("Content-Type", "application/json");
res.json(userFavs);
console.log("Favourites Created");
}, (err) => next(err))
.catch((err) => next(err));
})
.catch((err) => next(err));
})
.put(authenticate.verifyUser, (req, res, next) => {
res.statusCode = 403;
res.end('PUT operation is not supported on /favourites/:dishId');
})
.delete(authenticate.verifyUser, (req, res, next) => {
Favourites.find({})
.populate('user')
.populate('dishes')
.then((favourites) => {
var user;
if (favourites)
user = favourites.filter(fav => fav.user._id.toString() === req.user.id.toString())[0];
if (user) {
user.dishes = user.dishes.filter((dishid) => dishid._id.toString() !== req.params.dishId);
user.save()
.then((result) => {
res.statusCode = 200;
res.setHeader("Content-Type", "application/json");
res.json(result);
}, (err) => next(err));
} else {
var err = new Error('You do not have any favourites');
err.status = 404;
return next(err);
}
}, (err) => next(err))
.catch((err) => next(err));
});
module.exports = favouriteRouter;
收藏夹模式
const mongoose = require('mongoose');
const Schema = mongoose.Schema;
const favouriteSchema = new Schema({
user : {
type: mongoose.Schema.Types.ObjectId,
ref: 'user'
},
dishes : [{
type: mongoose.Schema.Types.ObjectId,
ref: 'dishes'
}]
},{
timestamps: true
});
var Favourites = mongoose.model('Favorite', favouriteSchema);
module.exports = Favourites;
/favourites 和 /favourites/:dishId 获取请求的代码不起作用,输出为
Schema hasn't been registered for model "user". Use mongoose.model(name, schema)
同样对于 /favourites 上的发布请求,它的输出为:
req.body is not iterable