Node和Express中的错误处理

时间:2016-06-09 01:01:04

标签: node.js express

我的应用程序不时遇到错误,导致整个事情崩溃。然后我必须登录服务器并每次重新启动它。

在网上搜索了一段时间后,我发现domains是Node中处理错误处理的好方法。在进一步挖掘之后,我发现domains现已被弃用(不知道为什么?)。

然后我在网上找到了一些答案,使用以下代码可能是有益的:

process.on('uncaughtException', function(err) {
  console.log(err);
});

虽然,这只是针对Node,而不是Express。因此,如果代码位于带有Express的http请求的中间,则不会向浏览器返回任何内容,因此将其置于不稳定状态(这也可能会占用服务器上的内存)。

在NodeJS / ExpressJS中,在保持服务器运行的同时处理错误的最佳方法是什么?

1 个答案:

答案 0 :(得分:1)

您可以在server.js或其等价物的末尾添加错误处理程序。 它可以是

之类的东西
app.use(function (err, req, res, next) {
    if (! err) {
        return next();
    }

    res.status(500);

    res.render('path/to/500/page'); // or send out json, what ever you need.
});

为了发现错误,我首选的方法是try catch

将所有异步方法包装在一个承诺中,或者使用蓝鸟来promisify

在您的路线中,使用co-expressyield承诺。

示例

function mySexyMethod() {
    return new Promise(function (resolve, reject) {
        someAsyncMethod(params, function (err, data) {
            if (err) {
                return reject(err);
            }

            resolve(data);
        })
    });
}


/// Express router

const wrap = require('co-express');

router.verb('some-route', wrap(function* (req, res, next) {

    let val;

    try {
        val = yield mySexyMethod();
    } catch (e) {
        return next(e);
    }
});

如果出现错误,将调用server.js中的错误处理程序。

至于确保节点进程在服务器上永久运行,请使用forever