处理 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');
};
});
});
编辑:抱歉,已删除 .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);
}
我有一个特殊情况,我想清除 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');
};
});
});
编辑:抱歉,已删除
.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);
}