谈话很便宜,所以我先给你看一下我的代码。
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'
答案 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
返回undefined
而save
在相同条件下返回的原因。
无论如何,修改后的代码如下所示。
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);
});