簡體   English   中英

Moongose數組indexOf尚未完成運行

[英]Moongose array indexOf doesn't finish running

我正在嘗試使用Mongoose Array indexOf來檢查id是否在另一個模式的引用對象的數組中。

以下是架構。 貓鼬陣列是菜餚。

const mongoose = require('mongoose');
const Schema = mongoose.Schema;

var favoriteSchema = new Schema({
    user: {
        type: mongoose.Schema.Types.ObjectId,
        ref: 'User'
    },
    dishes: [
        {
            type: mongoose.Schema.Types.ObjectId,
            ref: 'Dish'
        }
    ]
}, {
    timestamps: true
});

var Favorites = mongoose.model('Favorite', favoriteSchema);

module.exports = Favorites;

問題就在網上

if (favorites.dishes.indexOf(mongoose.Types.ObjectId(req.params.dishId)) === -1){

線路在以下快遞路由器中

const express = require('express');
const bodyParser = require('body-parser');
const mongoose = require('mongoose');
var authenticate = require('../authenticate');
const cors = require('./cors');

const Favorites = require('../models/favorite');
const Dishes = require('../models/dishes');

const favoriteRouter = express.Router();

favoriteRouter.use(bodyParser.json());

favoriteRouter.route('/:dishId')
.post(authenticate.verifyUser, (req, res, next) => {
    if(mongoose.Types.ObjectId.isValid(req.params.dishId)) {
        //Dishes.findById(mongoose.Types.ObjectId(req.params.dishId))
        Dishes.findById(req.params.dishId)
        .then((dish) => {
            if (dish != null) {
                //console.log("dish: ", dish);
                Favorites.findOne({user: req.user._id})
                .then((favorites) => {
                    //console.log("favorite: ", favorites);
                    if (favorites != null){
                        //favorites = favorites[0];
                        console.log("**1", favorites.dishes);
                        if (favorites.dishes.indexOf(mongoose.Types.ObjectId(req.params.dishId)) === -1){
                            console.log("**1");
                            favorites.dishes.push(req.params.dishId);
                            favorites.save()
                            .then((favorites) => {
                                res.statusCode = 200;
                                res.setHeader('Content-Type', 'application/json');
                                res.json(favorites);
                            }, (err) => next(err))
                            .catch((err) => next(err));
                        } //Error not returned if it is already in the list.
                    }else{
                        Favorites.create({user: req.user._id})
                        .then((favorites) => {
                            favorites.dishes.push(mongoose.Types.ObjectId(req.params.dishId));
                            favorites.save()
                            .then((favorites) => {
                                res.statusCode = 200;
                                res.setHeader('Content-Type', 'application/json');
                                res.json(favorites);
                            }, (err) => next(err))
                        }, (err) => next(err))
                        .catch((err) => next(err));
                    }
                }, (err) => next(err))
                .catch((err) => next(err));
            }else {
                err = new Error('Dish ' + req.params.dishId + ' is not in the database.');
                err.status = 404;
                return next(err);
            }

        }, (err) => next(err))
        .catch((err) => next(err));
    }else{
        err = new Error('Dish ' + req.params.dishId + ' is not in the database.');
        err.status = 404;
        return next(err);
    }

});

module.exports = favoriteRouter;

如何解決問題?

您不需要強制轉換objectId,就像這樣

favorites.dishes.indexOf(req.params.dishId === -1)

如果要返回已存在的錯誤,則應添加else塊以引發錯誤。

我還建議您可以使用async/await語法編寫代碼,這比嵌套的Promise干凈得多。

https://javascript.info/async-await

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM