2016-07-18 2 views
2

Как мне найти код ошибки с оператором return next (err), чтобы я мог отображать его в моем улове все промежуточное ПО?введите код ошибки с 'return next (err);'

var express = require('express'); 
var exphbs = require('express-handlebars'); 
var fs = require("fs"); 
var app = express(); 

app.engine('handlebars', exphbs({defaultLayout: 'main'})); 
app.set('view engine', 'handlebars'); 

app.get('/', function(req, res, next) { 

    // simulate 404 error 
    fs.readFile("foo.txt", "utf8", function(error, data) { 
     if(error) { 
     next(new Error('Aiiii caramba')); 
     } 
    }); 

}); 

/* Error Handling (gotta catch 'em all) */ 
app.use(function(err, req, res, next) { 
    res.status(err.status || 500) 
    .render('error', { 
    status: req.status, 
    error: err 
    }); 
}); 

app.listen(3000, function() { 
    console.log('Listening...'); 
}) 

Объект Error не принимает аргумент для кода ошибки. Я также попытался установить статус ответа, прежде чем возвращаться дальше ... безрезультатно.

res.status(404); return next(err); 

Независимо от того, что я делаю, я получаю ошибку 500.

Заранее спасибо за ваше время.

+0

Если вы хотите, чтобы ваш объект 'Error' имел свойство' status', то почему бы просто не установить свойство 'status' на объект' Error', прежде чем передать его в 'next'? Это ответ на ваш вопрос? – apsillers

ответ

2

Нет причин, по которым Error должен иметь status. Если вы этого хотите, вы должны создать собственную ошибку и наследовать ее от Error.

В ES6 это можно сделать следующим образом:

class NotFound extends Error { 
    constructor(message) { 
     super(message); 
     this.status = 404; 
    } 
} 

Если вы застряли с ES5, вы можете вместо этого использовать util модуль снабжен узлом:

var util = require('util'); 

function NotFound(message) { 
    Error.call(this); 
    this.message = message; 
    this.status = 404; 
} 

util.inherits(NotFound, Error); 

Теперь вы можете бросить ваша пользовательская ошибка как next(new NotFound('Aiiii caramba'));. Возможно, NotFound('Aiiii caramba') ясно выражает вид встреченной ошибки.

1

проблема с обработкой ошибок после промежуточного программной:

/* Error Handling (gotta catch 'em all) */ 
app.use(function(err, req, res, next) { 
    res.status(err.status || 500) 
    .render('error', { 
    status: req.status, 
    error: err 
    }); 
}); 

вас там строка: res.status(err.status || 500) и так как ваш объект ошибки не имеет поля статуса, он всегда назначаются 500

+0

Спасибо, Нир. Я понимаю, почему он получает 500 ... Я должен был быть более ясным: как передать ему другой код ошибки? – rsilva

Смежные вопросы