错误"/>
使用model.save()在猫鼬中同时更新用户会引发错误
当我尝试多次更新用户字段时,出现猫鼬错误。我要实现的是在对外部资源进行API调用后,根据某些条件更新该用户。据我观察,我在processUser()
函数中同时达到了两个条件因此,user.save()
几乎同时被调用,猫鼬对此抛出的错误并不满意:
MongooseError [ParallelSaveError]: Can't save() the same doc multiple times in parallel. Document: 5ea1c634c5d4455d76fa4996
我知道是有罪的,我的代码是这里的罪魁祸首,因为我是新手。但是,有什么方法可以在不出现此错误的情况下达到我想要的结果吗?谢谢。
function getLikes(){
var users = [user1, user2, ...userN]
users.forEach((user) => {
processUser(user)
})
}
async function processUser(user){
var result = await makeAPICall(user.url)
// I want to update the user based on the returned value from this call
// I am updating the user using `mongoose save()`
if (result === someCondition) {
user.meta.likes += 1
user.markModified("meta.likes")
try {
await user.save()
return
} catch (error) {
console.log(error)
return
}
} else {
user.meta.likes -= 1
user.markModified("meta.likes")
try {
await user.save()
return
} catch (error) {
console.log(error)
return
}
}
}
setInterval(getLikes, 2000)
回答如下:您的代码中需要解决一些问题。
1)processUser是一个异步函数。 Array.prototype.forEach
不遵循here on MDN中所述的异步功能。
2)setInterval不遵守here on MDN中所述的函数的返回值,因此,传递返回promise(异步/等待)的函数将不会达到预期的效果。
3)setInterval不应与运行时间可能比页面底部here on MDN中的Usage Section
中记录的时间间隔长的函数一起使用。
在最好的情况下,每2秒为每个用户点击一个外部api并对结果做出反应将是有问题的。我首先要问自己,这是否绝对是实现总体目标的only方法。
如果是唯一的方法,则可能要使用上面#2链接中提到的递归setTimeout()
或使用setInterval()
there's one on npm here的异步版本来实现您的解决方案
更多推荐
使用model.save()在猫鼬中同时更新用户会引发错误
发布评论