【问题标题】:await in javascript for of loop using mongoose使用 mongoose 在 javascript for of 循环中等待
【发布时间】:2021-11-29 02:19:44
【问题描述】:

我的代码有什么问题吗?我用快递和猫鼬

router.get('/c/:hashtoken', validateEmailToken, catchAsync(async(req,res)=>{
    const hashtoken = req.params.hashtoken
    const hashtoken2 = createHash('sha256').update(hashtoken).digest('hex')
    const realHashTokens = await EmailToken.find({hashtoken2})
    if(realHashTokens.length===0){
        req.flash('error','Incorrect email verification token or Your account has been activated')
        return res.redirect('/')
    }
    const toDeleteTokenId = []
    for(let realHashToken of realHashTokens){
        let theUser = await User.findById(realHashToken.user)
        theUser.active = true
        await theUser.save()
        toDeleteTokenId.push(realHashToken._id)
    }
    for (let theId of toDeleteTokenId){
        await EmailToken.findByIdAndDelete(theId)
    }
    req.flash('success','Success! Your account has been activated')
    return res.redirect('/')
}))

该页面从未响应。它一直在加载,但是如果我签入数据库,用户就会变得活跃

【问题讨论】:

  • 这是一个 Ajax 调用吗?或在发出此请求的浏览器中键入的 URL。 Ajax 调用不会导致浏览器更改它们正在显示的页面,除非您专门编写客户端接收 Javascript 来查找 302 状态并将 window.location 设置为新页面。
  • hello @jfriend00 ,这是在浏览器中输入的网址。用户从他们的电子邮件中点击此链接
  • 好吧,那么我会说在你的函数中放一个try/catch,这样你就可以检测到任何拒绝的await 语句。您目前没有任何错误处理。
  • 它在 catchAsync 函数中。它是 try catch 的包装器
  • 然后,跟踪您的服务器端函数并观察调试器中的每一行。如果你不知道怎么做,那就学习吧。如果您不想学习,请在该请求处理程序的每一行代码之间放置一个console.log() 语句,这样您就可以准确地看到它在做什么和没有做什么。来这里 - 这是基本的调试 - 这是你如何解决这样的问题。我们不能为您做 - 您必须自己做。

标签: javascript node.js mongodb express mongoose


【解决方案1】:

我已经解决了这个问题。此代码中的 User 模型具有 post mongoose 中间件,并且在该函数中,我调用 next() 即使在那之后没有其他 post 中间件,因此服务器以长响应响应并且页面继续加载。

【讨论】:

    【解决方案2】:

    设置错误处理程序或包装在 try/catch 中。 同时添加更多调试语句。

    router.get('/c/:hashtoken', validateEmailToken, catchAsync(async(req,res)=>{
    try {
        console.log('request received')
        const hashtoken = req.params.hashtoken
        const hashtoken2 = createHash('sha256').update(hashtoken).digest('hex')
        console.log('finding token')
        const realHashTokens = await EmailToken.find({hashtoken2})
        if(realHashTokens.length===0){
            req.flash('error','Incorrect email verification token or Your account has been activated')
            return res.redirect('/')
        }
        const toDeleteTokenId = []
        console.log('finding user')
        for(let realHashToken of realHashTokens){
            let theUser = await User.findById(realHashToken.user)
            theUser.active = true
            await theUser.save()
            toDeleteTokenId.push(realHashToken._id)
        }
        console.log('deleting')
        for (let theId of toDeleteTokenId){
            await EmailToken.findByIdAndDelete(theId)
        }
        console.log('completed - redirecting')
        req.flash('success','Success! Your account has been activated')
        return res.redirect('/')
    }
     catch(e) {
       console.error(e)
       // res.sendStatus(500)
       req.flash('error', e.message)
       return res.redirect('/')
    }
    }))
    
    

    【讨论】:

    • 它仍然没有在我的控制台上打印任何内容
    • 正如 OP 所说,包装所有这些的 catchAsync() 应该进行错误处理。
    • 但如果问题出在 catchasync 上,则不会发送响应;这将其排除在调试之外,以确保所有分支都调用 res.redirect。
    • @Ben 下一步是查看代码停止的位置,因此我将添加调试语句以找出瓶颈所在。你的一个异步没有兑现它的承诺......
    猜你喜欢
    • 2021-10-18
    • 2015-09-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-09-07
    • 2023-01-20
    • 2018-06-09
    相关资源
    最近更新 更多