我创建了nodejs + express应用程序。现在在我的应用程序中,异常捕获错误发送如下
app.get('/data', (req, res) => {
if(!req.params.token){
return res.status(403).send('Access token not provided');
}
//do something here
});
不是发送 res.status(403).send('未提供访问令牌'); 可以发送类似的内容
exception.js
class Forbidden {
constructor(message,stack = null){
this.code = 403;
this.message = message
this.stack = stack;
}
}
app.js
var httpForbidden = require('exception.js');
app.get('/data', (req, res) => {
if(!req.params.token){
return new httpForbidden ('Access token not provided');
}
//do something here
});
而且我怎样才能在一次地方发现所有异常?
答案 0 :(得分:4)
您可以使用以下内容:
class httpError {}
class httpForbidden extends httpError {
constructor(message, stack = null) {
super();
this.code = 403;
this.message = message
this.stack = stack;
}
}
app.get('/', (req, res) => {
if (!req.params.token) {
throw new httpForbidden('Access token not provided');
}
...
});
app.use((err, req, res, next) => {
if (err instanceof httpError) {
return res.status(err.code).send(err.message);
}
res.sendStatus(500);
});
这使用Express error handling middleware来检查抛出的错误是否是httpError
的实例(这将是您要创建的所有HTTP错误类的超类)如果是这样,将根据代码和消息生成特定响应(否则生成通用500错误响应)。
答案 1 :(得分:2)
我喜欢创建一个单独的函数,以及其他实用程序函数(比如在 lib.js 中),它创建一个格式正确的JSON响应对象,并选择适当的记录器来记录响应,具体取决于HTTP状态代码。
var logger = require("./loggger");
module.exports.sendResponse = function (res,code,message,data) {
if(code<100 || code>599) {
throw new Error("response cannot be sent. Invalid http-code was provided.");
}
var responseLogger = code>=500 ? logger.error : logger.debug;
var responseObject = {
"code" : code,
"message" : message
};
if(data) {
responseObject.data = data;
}
responseLogger(responseObject);
res.status(code).json(responseObject);
};
var lib = require("./lib");
/*
Relevant Express server code
*/
app.get('/data', function (req,res) {
if(!req.params.token){
return lib.sendResponse(res,403,"Access token not provided");
}
// Rest of business logic
});
注意:您可以编写自己的日志记录功能,但我强烈建议您在winston
)等标准日志记录库上构建它
答案 2 :(得分:0)
您可以使用:
res.code(403).json({message: '...', stack: '...'});
并发送您想要的任何内容。但是你通过在响应对象上调用方法来做到这一点。
而且我怎样才能在一次地方发现所有异常?
非常糟糕的主意。你应该处理它们发生的所有错误,这样你仍然可以有一些上下文以合理的方式处理它们。否则你可以抛出异常并返回500个错误。
答案 3 :(得分:0)
You can use boom library instead, which provides a set of utilities for returning HTTP errors
HTTP 4xx Errors
Boom.badRequest([message], [data])
Boom.unauthorized([message],[scheme], [attributes])
HTTP 5xx Errors
Boom.badImplementation([message], [data]) - (alias: internal)
Boom.notImplemented([message], [data])
for more api documentation visit here