表达如何处理重定向错误&消息

时间:2016-06-21 12:02:00

标签: node.js express

我似乎无法正确处理如何正确处理错误。

基本的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文件但没有重定向或渲染。在第二部分中没有提供任何状态。

你们实施了哪些做法?

1 个答案:

答案 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;