【问题标题】:Mongoose validation issue猫鼬验证问题
【发布时间】:2020-03-26 09:18:41
【问题描述】:

我目前有以下架构:

Schema({
    _id: { type: Number, default: Math.floor(Date.now() / 1000) + 24 * 60 * 60 },
    userID: { type: Number, require },
    assignmentID: {
        type: Number,
        validate: {

            validator: function (v) {
                if (!v) {
                    Promise.reject(false);
                }
                else {
                    Assignment.findById(v, (assignmentErr, assignmentDoc) => {
                        if(assignmentErr || !assignmentDoc){
                            Promise.reject(false);
                        }
                        else{
                            Promise.resolve(true);
                        }
                    })
                }
            },
            message: 'Invalid assignment ID.'
        }
    }

我面临的问题是我在控制台中不断收到警告,提示我没有处理被拒绝的承诺。即使 promise 被拒绝,文档也会保存在数据库中。

我保存新文档的方式如下:

schema.save((err, savedDoc) => {
}

我该如何解决这个问题,或者有没有更好的方法来进行这样的复杂验证?

【问题讨论】:

    标签: node.js mongoose


    【解决方案1】:

    你可以试试下面的代码:

     assignmentID: {
        type: Number,
        validate: {
    
            validator: function (v) {
                if (!v) {
                   return Promise.reject(false);
                }
    
                return Assignment.findById(v)
                    .then(assignmentDoc => {
                        if( !assignmentDoc){
                          return  Promise.reject(false);
                        }
                        else{
                           return Promise.resolve(true);
                        }
                    })
                    .catch(error => {
                       return Promise.reject(error );
                    })
            },
            message: 'Invalid assignment ID.'
        }
    }
    

    更新 您也可以尝试如下所示:

     assignmentID: {
        type: Number,
        validate: {
    
            validator: function (v) {
                if (!v) {
                   return Promise.reject(false);
                }
    
                return new Promise( (resolve, reject) => {
                    Assignment.findById(v, (assignmentErr, assignmentDoc) => {
                        if(assignmentErr || !assignmentDoc){
                            reject(false);
                        }
                        else{
                            resolve(true);
                        }
                    })
                });
    
            },
            message: 'Invalid assignment ID.'
        }
    }
    

    【讨论】:

    • 非常感谢 - 它有效!您能否解释一下您和我之间的区别,因为我不确定我是否完全理解它?
    • 据我所知,你是resolve/reject,但永远不会返回。我正在更新我的答案,您可能更容易理解,谢谢
    猜你喜欢
    • 2016-09-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-02-14
    • 1970-01-01
    • 1970-01-01
    • 2018-06-23
    • 2012-01-07
    相关资源
    最近更新 更多