Node.js - 每个Express请求的域,在另一个域内

时间:2013-07-18 17:11:06

标签: javascript node.js express connect npm

节点中的错误处理。哎呀!

我正在尝试布局像这样的基本节点应用程序......

  

群集 - >工人 - >服务器域 - >快速请求域

因此,如果错误被抛出18层到调用堆栈中,因为有人在登录表单上拼错了他们的名字,整个服务器都不会崩溃。

以下是模拟工人部分的一些基本代码:

var domain, server;

domain = require('domain');
server = domain.create();

server.on('error', function(e) {
    console.log('total meltdown...', e.stack);
});

server.run(function() {

    var express = require('express')();

    express.configure(function() {

        // Domain on EVERY request
        express.use(function(req, res, next) {
            var d = domain.create();

            d.on('error', function(e) {
                console.log('fired REQUEST error', e.stack);
                next(e);
            });

            d.run(next);

        });

        // Generic error handler
        express.use(function(e, req, res, next) {
            res.status(500);
            res.end('oops');
        });

        // Serve the request with a blatent error
        express.get('/', function(req, res) {

            this_function_does_not_exist();
            res.end('we will never get here');

        });
    });

    // Fire 'er up
    express.listen(3000);
});

我期待的是什么......

我卷曲http://localhost:3000/,得到一个不错的小'oops'错误,并在控制台中看到'触发REQUEST错误'和错误堆栈。

实际发生的事情......

我将此作为浏览器响应和控制台......

  

ReferenceError:未定义this_function_does_not_exist       在/Stuff/test.js:38:13       在回调中(/Stuff/node_modules/express/lib/router/index.js:161:37)       在param(/Stuff/node_modules/express/lib/router/index.js:135:11)       传球时(/Stuff/node_modules/express/lib/router/index.js:142:5)       在Router._dispatch(/Stuff/node_modules/express/lib/router/index.js:170:5)       at Object.router(/Stuff/node_modules/express/lib/router/index.js:33:10)       在下一个(/Stuff/node_modules/express/node_modules/connect/lib/proto.js:190:15)       在下一个(/Stuff/node_modules/express/node_modules/connect/lib/proto.js:192:9)       在b(domain.js:183:18)       在Domain.run(domain.js:123:23)

现在为什么会这样做呢?

1 个答案:

答案 0 :(得分:2)

好的,已解决 - Express有一个try / catch块,它首先进入我不存在的函数调用。

要让域捕获它,需要将其从当前调用堆栈中取出,如...

        process.nextTick(function() {
            this_function_does_not_exist();
            res.end('we will never get here');
        });

然后该域名将抓住它。