我似乎无法正确处理如何正确处理错误。
基本的404,没问题(只需设置标题404并渲染'未找到'页面)。但是,让我们举个例子说:
您可以按ID找到用户,但用户不存在。我想为此你将header-status设置为500.但是如何重新定向页面(或者只是分配重定向页面)并设置flashmessage?
在大多数教程中,我通常会发现以下内容:
model.SignUp.forge({id: req.params.id}).fetch({withRelated: ['usermeta']}).then(function(user) {
res.render('admin/pages/users/details', {title: 'Signups', error: false, details: user});
}).catch(function(err) {
res.status(500).json({error: true, data: {message: err.message}});
});
只要发生错误,您就会发现问题。我有时也会遇到这个问题:
transporter.sendMail(mailOptions, function(err) {
if(err) {
req.flash('error', 'blablabla');
res.redirect('back');
}
});
在第一种情况下,您返回一个json文件但没有重定向或渲染。在第二部分中没有提供任何状态。
你们实施了哪些做法?
答案 0 :(得分:2)
我非常喜欢我的快递应用中的中央错误处理。这是如何运作的?好吧,我有一个HTTP错误对象库,它们都有一个'status'属性。我的所有路由处理程序和middeware根据发生的情况返回一个带有其中一个错误对象的回调,如果出现错误,不要调用res.send(或任何其他res。*方法)。然后,我有一个错误处理中间件(或多个,如果我变得复杂),它决定我是否要进行重定向或只是发送响应代码,或根据应用程序的需要。
举个例子:
app.post('/signup', function(req, res, next){
model.SignUp.forge({id: req.params.id}).fetch({withRelated: ['usermeta']}).then(function(user) {
res.render('admin/pages/users/details', {title: 'Signups', error: false, details: user});
}).catch(function(err) {
return next(new HttpServerError(err));
});
}
HttpServerError的status
为500,所以我至少有一个'catch all'错误处理中间件看起来像这样(在json api的情况下):
app.use(function(err, req, res, next){
console.log(err.stack);
res.status(err.status).send({message: err.clientMessage});
});
您还可以执行多个处理程序,并根据请求的状态进行渲染或重定向(例如,接受标头或错误类型)。
例如,在传统的Web应用程序中,我可能会使用错误的名称来确定要呈现的模板,如果是403错误,我可能会重定向到登录页面。
为了完整起见,这是一个示例HttpServerError:
'use strict';
const util = require('util');
function HttpServerError(message){
this.message = message;
this.clientMessage = 'Dangit! Something went wrong on the server!';
this.status = 500;
Error.captureStackTrace(this, NotFoundError);
}
util.inherits(HttpServerError, Error);
HttpServerError.prototype.name = 'HttpServerError';
module.exports = HttpServerError;