最新消息:雨落星辰是一个专注网站SEO优化、网站SEO诊断、搜索引擎研究、网络营销推广、网站策划运营及站长类的自媒体原创博客

使用model.save()在猫鼬中同时更新用户会引发错误

网站源码admin21浏览0评论

使用model.save()在猫鼬中同时更新用户会引发错误

使用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的异步版本来实现您的解决方案

发布评论

评论列表(0)

  1. 暂无评论