Mongoose更新成功但返回undefined

时间:2018-02-09 08:18:42

标签: mongoose promise

谈话很便宜,所以我先给你看一下我的代码。

const savePostsInOrder = (idx, limit) => {
    if (idx >= limit) {
        console.log("Save completed.");
        return;
    }
    Post.find({
        title: posts[idx].title,
        belongToMajor: posts[idx].belongToMajor,
        belongToMinor: posts[idx].belongToMinor,
    }).then(
        (doc) => {
            doc.map((doc) => {
                if (posts[idx].content !== doc.content) {
                    /* if there is (update) */

                    Post.update({_id: doc._id}, {$set: posts[idx]}, (err) => {
                        if (err) {
                            console.log("Failed to save: " + posts[idx].title);
                            return console.error(err);
                        }
                    }).then(() => {
                        console.log("Succeeded to update: " + posts[idx].title);
                        savePostsInOrder(++idx, limit);
                    });
                }
            });
        }
    );
}
如你所见,

Post是一个猫鼬对象。

posts是对象的全局列表,我想用posts的对象更新我的mongodb文档。

问题是,Post.update({_id: doc._id}, {$set: posts[idx]}, callback)返回undefined,而非承诺。 update成功更新现有的数据库模型,但返回undefined。任何人都可以告诉我一个解决方案或原因?

这是我收到的错误消息。

  

(node:3338)UnhandledPromiseRejectionWarning:未处理的promise拒绝(拒绝id:1):TypeError:无法读取未定义的属性'then'

2 个答案:

答案 0 :(得分:0)

.update请勿Promise使用callback

Post.update({_id: doc._id}, {$set: posts[idx]}, (err) => {
    if (err) {
        console.log("Failed to save: " + posts[idx].title);
        return console.error(err);
    }
    console.log("Succeeded to update: " + posts[idx].title);
    savePostsInOrder(++idx, limit);
});

答案 1 :(得分:0)

我已经解决了。

如果我使用回调参数处理异常,update不会返回任何猫鼬对象,所以除了回调参数之外我必须使用catch

我不知道update返回undefinedsave在相同条件下返回的原因。

无论如何,修改后的代码如下所示。

Post.update({_id: doc._id}, {$set: posts[idx]})
    .then(() => {
        console.log("Succeeded to update: " + posts[idx].title);
        savePostsInOrder(++idx, limit);
    }).catch((err) => {
        console.log("Failed to save: " + posts[idx].title);
        return console.error(err);
    });