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

Handling 503 Error in Express/Node.js especially in TryCatch case

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

app.post('/api/fetch/user', function(req, res){
   var email = req.body.emailTxt;
   db.one('SELECT * FROM users WHERE email=', [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() 这很好但很奇怪它 return s 503 - Request timeout 错误。 我试图删除 if() 中的条件以便进行调试,但似乎无论如何 if-else 似乎在 ExpressJs 中不起作用。

注意:一切正常,当控制保持在 .then() 时也是如此。如果我删除 if,else 并保留简单错误 display/response return 那么一切正常。我的 API 中没有什么特别的内容;这只是我准备测试的一个单页脚本 API.

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

因此,正确的方法是:

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

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

我不知道为什么 if-else 会产生问题,但你可以换个方式。

在您的特定情况下,error 没有附加 .search() 方法。所以最好先使用 .toString();.

将其解析为字符串

我认为你在 .catch 块中出错。

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

app.post('/api/fetch/user', function(req, res){
     var email = req.body.emailTxt;
     db.one('SELECT * FROM users WHERE email=', [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 块中的错误。


//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);
}