【问题标题】:Request Timeout Issue - Node/Heroku请求超时问题 - Node/Heroku
【发布时间】:2021-04-17 17:19:15
【问题描述】:

下面的这条发布路线大约有 1/100 次超时。我正在尝试优化代码以避免这些超时,但它们继续发生。我可以做些什么来进一步避免这些请求超时?

我不确定如何解决此问题。这条路线的发布时间不应超过 30 秒。

感谢您的帮助!

router.post("/updateAccount", usernameToLowerCase, async function(req, res){
    
   
    if (req.user) {
    
    await User.findOne({username: req.body.currentUser}, function(err, user) {
    console.log('first ' + user)
    if (err) {
    console.log('cant find user err' + err)
    return done(err);
    }
    
    user.username = req.body.username;
    user.password = req.body.password;
    user.accountUpdated = true;
    
    
    user.save(function(err){
    
    if (err) {
    req.flash("error", "It looks like that email address is taken. Please use a different email address");
    res.redirect('back');
    
    } else {
    
    req.logout();
    
    req.login(user, function(err) {

    if (err) console.log('There was an account error' + err)
    req.flash("success", "Your account has been created! Your username is " + user.username );
    res.redirect('/results')
    
    });
    }
    });
    });
    
    }
    });

【问题讨论】:

  • 在调试代码的时候,控制在哪一行没有越过?
  • 如果req.user返回false,cant find user errreturn done(err)???

标签: node.js mongodb express heroku


【解决方案1】:

你可以使用findOneAndUpdate找到匹配的文档,根据更新参数更新它

try{
    let filter = {username: req.body.currentUser};
    let user = {
        username = req.body.username;
        password = req.body.password;
        accountUpdated = true
    } 
    let user = await User.findOneAndUpdate(filter, user,{
        select: "_id username",
        new: true,
    });
    req.logout();
    req.login(user, function(err) {
        if (err) console.log('There was an account error' + err)
        req.flash("success", "Your account has been created! Your username is " + user.username );
        res.redirect('/results')
        });
}
catch(error){
    console.log(error)
    req.flash("error", "It looks like that email address is taken. Please use a different email address");
    res.redirect('back');
    //handle error
}

【讨论】:

  • 谢谢!你能解释一下为什么这会有所帮助吗?
  • 我希望这个方法能解决你的问题,以你的方式对数据库进行了两次调用,但在这种方式下,只执行了一次对数据库的调用
【解决方案2】:

我相信,由于您收到 100 个请求超时中的 1 个,因此更多的是回调问题,因为异步事件在队列中并且没有错误发生。

我也相信作为异步请求的 req.logout() 必须在 req.login() 之前处理。

请在将其计算为查询问题之前检查这些点。

【讨论】:

    【解决方案3】:

    尝试在你的 User 模型中添加更多的索引,使用多个字段进行查找将有助于提高操作速度。

    在用户名字段中添加唯一索引会有所帮助

    您也可以使用 Model.updateOne() 更新文档而不从数据库中加载它,因此该文档不在 Node.js 进程内存中

    如果这没有帮助,您可以将服务器的超时时间增加到您想要的任何数字

    var server = app.listen()
    server.timeout = 2000
    

    但在你的情况下,你说的是 30 秒。太多了。 尝试使用

    try{}catch(){}
    

    看看是否有错误没有正确处理

    【讨论】:

      猜你喜欢
      • 2019-09-08
      • 2012-06-14
      • 2015-12-19
      • 2017-03-22
      • 2013-09-05
      • 1970-01-01
      • 2020-06-20
      • 1970-01-01
      • 2021-06-22
      相关资源
      最近更新 更多