Javascript Node.js-每个Express请求的域,位于另一个域内

Javascript Node.js-每个Express请求的域,位于另一个域内,javascript,node.js,express,connect,npm,Javascript,Node.js,Express,Connect,Npm,节点中的错误处理。啊 我正在尝试像这样布局一个基本节点应用程序 集群->工作者->服务器域->快速请求域 因此,如果由于有人在登录表单上拼错了自己的名字而将错误抛出到调用堆栈的18层深处,则整个服务器不会崩溃 下面是一些模拟辅助零件的基本代码: var domain, server; domain = require('domain'); server = domain.create(); server.on('error', function(e) { console.log('t

节点中的错误处理。啊

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

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

因此,如果由于有人在登录表单上拼错了自己的名字而将错误抛出到调用堆栈的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);
});
我所期待的…

I curl
http://localhost:3000/
,获取一个很好的小“oops”错误,并查看控制台中的“激发请求错误”和错误堆栈

实际发生了什么…

我得到这两个作为浏览器响应,并在控制台

引用错误:此函数不存在未定义 at/Stuff/test.js:38:13 在回调时(/Stuff/node_modules/express/lib/router/index.js:161:37) at param(/Stuff/node_modules/express/lib/router/index.js:135:11) 通过时(/Stuff/node\u modules/express/lib/router/index.js:142:5) 路由器调度(/Stuff/node\u modules/express/lib/Router/index.js:170:5) 在Object.router(/Stuff/node\u modules/express/lib/router/index.js:33:10) 接下来(/Stuff/node\u modules/express/node\u modules/connect/lib/proto.js:190:15) 接下来(/Stuff/node\u modules/express/node\u modules/connect/lib/proto.js:192:9) 在b(domain.js:183:18) 在Domain.run(Domain.js:123:23)


现在它为什么要这样做呢?

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

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

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

然后域会抓住它。

我很感谢您指出原因,但您实际上没有给出示例代码,说明“它需要从当前调用堆栈中取出”如果它是当前调用堆栈的一部分,Express将捕获它,并且它不会“冒泡”到域处理程序。问题是,我们并不总是知道什么时候会这样,而且它可能在调用res.send()/的函数之外,会将任何内容返回到浏览器。因此,通过使用process.nextTick,我们可以有效地绕过Express堆栈,并在当前调用堆栈的末尾独立运行它。。。但仍然在域的上下文中。因此,会触发一个错误,域将其拾取,并将其返回到res.send,它位于我的原始示例代码的上下文中。那有用吗?谢谢-我明白你的意思。您想在nextTick()中引发异常。