处理Express / Node.js中的503错误,尤其是在TryCatch情况下

时间:2016-11-25 10:46:59

标签: node.js postgresql express try-catch http-status-code-503

我有一个特殊情况,我想清除503错误的可能原因。以下代码段具有catch语句,该语句在系统无法找到任何结果时运行

app.post('/api/fetch/user', function(req, res){
   var email = req.body.emailTxt;
   db.one('SELECT * FROM users WHERE email=$1', [email])
       .then(function(data){
           console.log('DATA:', data);

           var userCard = { id: data.user_id, name: data.user_name, 
                            email: data.email, regDate: data.date_created };

           res.status(200).json({ 'valid': true, '_payload': userCard });
       })
       .catch(function(error){
           if(error.search(/No data returned from the query/im) > 0)    // regex case insensitive search and search multiline as source string is multiline
              res.status(500).send('Invalid Request Match');
           else 
              res.status(500).send('ERROR: '+error);
       })          

});

当我对此API终点进行API调用时,如果没有找到结果,控件会在catch()移动,这很好,但很奇怪,它会返回503 - Request timeout错误。 我试图删除if()中的条件以便进行调试,但似乎无论如何,if-else似乎在ExpressJs中都不起作用。

注意:一切运作良好,控制时间也在.then()。如果我删除if,else并保持简单的错误显示/响应返回,那么一切正常。我的API中没有任何特殊内容;它只是我准备测试API的一个单页脚本。

2 个答案:

答案 0 :(得分:1)

我认为.catch阻止了你的错误。

尝试修改代码并查看是否有帮助:

app.post('/api/fetch/user', function(req, res){
     var email = req.body.emailTxt;
     db.one('SELECT * FROM users WHERE email=$1', [email])
         .then(function(data){
             console.log('DATA:', data);

             var userCard = { id: data.user_id, name: data.user_name, 
                              email: data.email, regDate: data.date_created };

             res.status(200).json({ 'valid': true, '_payload': userCard });
         })
         .catch(function(error){
           console.error(error); //never ignore errors!
           try {
             //i think error is an Error Object here, so it doesn't have .search function
             if(error.search(/No data returned from the query/im) > 0)    // regex case insensitive search and search multiline as source string is multiline
                res.status(500).send('Invalid Request Match');
             else 
                res.status(500).send('ERROR: '+error);
           } catch (err) {
             console.error(err);
              res.status(500).send('some unknown error');
           };
         });
      });
  1. 修改:抱歉,已移除.finally,因为您可能会发送两次回复。

  2. 编辑,更好地处理.catch阻止中的错误。

  3. //make catch block error safe to make sure no error occurs
    if (error && error.message == 'No data returned from the query.') {
      res.status(500).send('Invalid Request Match');
    } else {
      res.status(500).send('ERROR: '+error);
    }
    

答案 1 :(得分:0)

我们在创建API服务时非常密切地使用ExpressJ中的响应代码。因此,我们直接使用它们而不是在if-else中执行catch()似乎是正确的方式。

因此,正确的方法是:

.catch(function(error){
        console.log('ERROR:', error);
        res.status(204).send('No Content; Invalid Request Match');
    })

但是,如果您想显示/返回详细信息,您也可以这样做。您可以查看:http://expressjs.com/en/api.html#res,了解有关回复方式的详细信息。您可以渲染HTML模板,或返回JSON响应甚至多行文本。

我不知道为什么if-else会产生问题,但你可以采取其他方式。

在您的特定情况下,error没有附加.search()方法。因此,最好先使用.toString();将其解析为字符串。