Javascript 在Node.js和Express中处理404、500和异常

Javascript 在Node.js和Express中处理404、500和异常,javascript,node.js,express,Javascript,Node.js,Express,我有一个node.js+Express+Express Handlebar应用程序。当用户转到不存在的页面时,我想将他们重定向到404页面,当出现内部服务器错误或异常时(不停止服务器),我想将他们重定向到500页面。在我的app.js中,我在最后编写了中间件来执行这些任务 app.get('*', function(req, res, next) { var err = new Error(); err.status = 404; next(); }); //Handl

我有一个node.js+Express+Express Handlebar应用程序。当用户转到不存在的页面时,我想将他们重定向到404页面,当出现内部服务器错误或异常时(不停止服务器),我想将他们重定向到500页面。在我的app.js中,我在最后编写了中间件来执行这些任务

app.get('*', function(req, res, next) {
    var err = new Error();
    err.status = 404;
    next();
});

//Handle 404
app.use(function(err, req, res, next){
    res.sendStatus(404);
    res.render('404');
    return;
});

//Handle 500
app.use(function(err, req, res, next){
    res.sendStatus(500);
    res.render('500');
});

//send the user to 500 page without shutting down the server
process.on('uncaughtException', function (err) {
  console.log('-------------------------- Caught exception: ' + err);
    app.use(function(err, req, res, next){
        res.render('500');
    });
});
然而,只有404的代码可以工作。因此,如果我尝试转到一个url

localhost:8000/fakepage
它成功地将我重定向到404页面。505不工作。对于异常处理,服务器会继续运行,但不会将我重定向到console.log之后的500错误页面

我被网上这么多的解决方案弄糊涂了,人们似乎为此采用了不同的技术

以下是我看过的一些资源


uncaughtexception上的进程用于应用程序进程,而不是每个请求的错误处理程序。注意,它在回调中出错,并且没有传递res。它是一个全局应用程序异常处理程序。在全局代码抛出的情况下,有这样的代码是很好的

一个选项是,您可以拥有所有正常路由(在您的示例中没有看到),然后是404的非错误处理程序final*路由。这始终是最后一条路线,意味着它已通过所有其他路线找不到匹配项。。。因此没有找到。这不是一个异常处理案例-您肯定知道他们请求的路径不匹配,因为它已失败

然后err路由可以返回500

问题是,您有两条错误路径,因此它总是命中第一条路径,硬代码返回404

express 4工具创建此模式:

var users = require('./routes/users');

// here's the normal routes.  Matches in order
app.use('/', routes);
app.use('/users', users);

// catch 404 and forward to error handler
// note this is after all good routes and is not an error handler
// to get a 404, it has to fall through to this route - no error involved
app.use(function(req, res, next) {
    var err = new Error('Not Found');
    err.status = 404;
    next(err);
});

// error handlers - these take err object.
// these are per request error handlers.  They have two so in dev
// you get a full stack trace.  In prod, first is never setup

// development error handler
// will print stacktrace
if (app.get('env') === 'development') {
    app.use(function(err, req, res, next) {
        res.status(err.status || 500);
        res.render('error', {
            message: err.message,
            error: err
        });
    });
}

// production error handler
// no stacktraces leaked to user
app.use(function(err, req, res, next) {
    res.status(err.status || 500);
    res.render('error', {
        message: err.message,
        error: {}
    });
});

变量配置文件=要求('./路线/配置文件);应用程序使用('/profie',profile);这就是我定义所有路由的方式。这很好-这些路由应该在404路由和错误路由之前设置-基本上是在上面设置了/和/用户路由的地方。路线排序至关重要,这正是上面的示例所做的。它通过要求用户来加载用户功能,并通过传递用户来设置/用户路由。然后在设置所有路由后添加404通配符路由,最后为示例添加错误500 RouteAnks。我有404在旧代码中工作,我仍然无法处理异常。例如,假设Url是/students/we232(其中we232是学生id)。如果我将其更改为乱七八糟或不存在的内容,我希望用户被定向到500,而不是服务器关闭。如何实现这一点?在您概述的案例中,get student路由将查找we232,最终发现它不存在,并返回404(在这种情况下它应该做什么)。在这种情况下,不会调用每个未处理的请求处理程序(err、req、res、next),因为它已“处理”。500用于未处理的服务器错误。当然,服务器不会停机,因为(1)它是在路由函数中处理的,(2)即使它没有得到处理,也会返回500。uncaughtexception上的应用程序级别不是每个请求处理程序-它用于处理应用程序中的全局异常