0

我正在尝试创建一个模型 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
4

0 回答 0