我有一个特殊情况,我想清除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的一个单页脚本。
答案 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');
};
});
});
修改:抱歉,已移除.finally
,因为您可能会发送两次回复。
编辑,更好地处理.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);
}
答案 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();
将其解析为字符串。