无法在我的mongoose查询中解决UnhandledPromiseRejectionWarning问题

时间:2017-01-13 02:39:21

标签: javascript node.js mongodb mongoose promise

我对mongoose和javascript承诺很新。我将以全局承诺方式编写更新查询,我的代码如下 -

metadataAPI.route('/:surveyID')
    .put(function(req, res) {
        Surveys.findOne({_id : req.params.surveyID}, {"metadata" : 1})
            .then(function(survey) {
                return survey.metadata;
            })
            .catch(function(err) {
                res.json({ Message : "Incorrect surveyID!"});
            })
            .then(function(metadata) {
                Surveys.findOneAndUpdate(
                        {_id : req.params.surveyID},
                        {
                            $set : {
                                "metadata.language" : req.body.language || metadata.language,
                                "metadata.createdBy" : req.body.createdBy || metadata.createdBy,
                                "metadata.qCount" : req.body.qCount || metadata.qCount,
                                "metadata.category" : req.body.category || metadata.category,
                                "metadata.suggestionEnable" : req.body.suggestionEnable || metadata.suggestionEnable,
                                "metadata.publish" : req.body.publish || metadata.publish,
                                "metadata.pageArray" : req.body.pageArray || metadata.pageArray
                            }
                        }
                    )
                    .then(function() {
                        Surveys.findOne({_id : req.params.surveyID}, {"metadata" : 1})
                            .then(function(survey) {
                                res.json(survey);
                            })
                            .catch(function(err) {
                                res.send(err);
                            });         
                    })
                    .catch(function(err) {
                        res.send(err);
                    }); 
            })
            .catch(function(err) {
                res.send(err);
            });
    });

我的问题是虽然我在每个then()函数之后都有catch()处理程序。我仍然从节点获得UnhandledPromiseRejectionWarning。我该怎么解决呢谢谢!

1 个答案:

答案 0 :(得分:0)

承诺的一个好处是,您可以完成一系列异步操作。在没有评估任何关于你的逻辑的情况下,我已经将操作弄平了,最后为链中发生的任何错误添加了一个catch。

Surveys.findOne({_id : req.params.surveyID}, {"metadata" : 1}).then(function(survey) {
    var metadata = survey.metadata;
    return Surveys.findOneAndUpdate({_id : req.params.surveyID},
        {
            $set : {
                "metadata.language" : req.body.language || metadata.language,
                "metadata.createdBy" : req.body.createdBy || metadata.createdBy,
                "metadata.qCount" : req.body.qCount || metadata.qCount,
                "metadata.category" : req.body.category || metadata.category,
                "metadata.suggestionEnable" : req.body.suggestionEnable || metadata.suggestionEnable,
                "metadata.publish" : req.body.publish || metadata.publish,
                "metadata.pageArray" : req.body.pageArray || metadata.pageArray
            }
        }
    )
}).then(function() {
    return Surveys.findOne({_id : req.params.surveyID}, {"metadata" : 1});
}).then(function(survey) {
    res.json(survey);
}).catch(function(err) {
    res.send(err);
});

关于内容的快速说明,我不记得mongoose是否要求您将.exec()链接到查询操作以获得承诺。