【问题标题】:How to manage HTTP errors in Node.js如何管理 Node.js 中的 HTTP 错误
【发布时间】:2013-01-18 21:11:48
【问题描述】:

您好,我正在开发我的第一个 Node.js 应用程序,我发现我的第一个问题非常基础,我无法捕获 HTTP 错误(404、500、...)

我已经关注了文档(我想是的),但我想我遗漏了一些东西。

这是我的代码:

var express = require('express')
app = express()
app.use(express.logger('dev'));

app.get('/', function(req, res) {
    res.send('Hellow World!!!')
})
app.use(app.router);
app.use(function(err, req, res, next) {
    console.error('Oh!! ERROR');
    console.error('My ERROR: ' + JSON.stringify(err));
});

app.listen(3000);
console.log('Server running at http://127.0.0.1:3000/');

提前致谢。

【问题讨论】:

    标签: node.js error-handling


    【解决方案1】:

    因此 express 的工作方式是,如果它到达整个中间件和路由处理程序堆栈的末尾并且没有任何响应,它将自动发送回退 404 响应而不会引发错误。这就是为什么没有调用您的错误处理中间件的原因。默认情况下,express 不会将 404 视为错误,这可能是正确的思考方式。

    如果您想对此进行自定义,您可以在堆栈末尾放置一个中间件,以直接提供自定义 404 页面或调用 next 并报错(如果您愿意)。

    app.get('/'...
    app.get('/two'...
    app.get(/'three'...
    
    app.use(middleware1...
    app.use(middleware2...
    app.use(app.router);
    app.use(function (req, res, next) {
        //Option 1: respond here
        return res.status(404).render('my_404_view');
        //Option 2: trigger error handler
        return next(new Error('404ed!'));
    }
    

    选项 2 将触发您的错误处理中间件。在那里,您必须从错误对象中获取信息,以确定要呈现的所需视图和要发送的状态代码。我个人定义了一个具有 404 代码的 errors.NotFound 类,并让我呈现友好的 404 页面视图。

    【讨论】:

    • 嗨@peter-lyons,感谢您的快速回答,现在我的错误中间件被触发了,但是我有一个问题,它总是被触发,即使找到了一条路线(并且页面正确返回) .我虽然认为如果其中一条路由响应其余中间件没有被触发......我错了吗?
    • 你是在渲染页面后调用next()吗?页面呈现后,您不应调用next()。仅从位于处理堆栈“中间”的中间件调用 next()
    • 第一次触发很奇怪,第二次调用正常,路由是这样的:app.get('/', function(req, res) { res.send('Index Page!!!') // 中间件页面只在第一次触发 })
    • 忘记了我的上一条评论,它运行良好,但我正在从浏览器进行测试,并且请求 /favicon.ico 触发了 404 错误它是由浏览器自动生成的,抱歉这个愚蠢的问题:-)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-11-17
    • 2020-07-11
    • 2012-01-19
    • 1970-01-01
    相关资源
    最近更新 更多