获取执行上下文的Node.js编程模式

我在node.js中编写一个web应用程序 现在,服务器上的每个处理都始终处于会话的上下文中,当请求到达服务器时,会在第一阶段检索或创build该会话。 之后,执行stream程将通过多个模块和callback。 我正在努力的是创build一个编程模式,以便在代码中的任何一点,会话对象是可用的,没有程序员要求它在每个函数调用中作为parameter passing它。

如果所有的代码都在一个单独的文件中,我可能有一个闭包,但是如果有其他文件中的其他模块的函数调用,我如何编程,使会话对象在被调用的函数中可用,而不传递它作为参数。 我觉得这两个文件中的两个函数应该有一些联系,但是如何安排这个就是我陷入困境的地方。

总的来说,我想说总有一个执行上下文可能是一个会话或networking请求,其处理分散在多个文件中,并且执行上下文对象在所有点上都是可用的。 实际上可以有多个用例,例如每个networking请求有一个Log对象或每个会话有一个Log对象。 做这项工作所需的pipe道应该是横向安装的,不需要应用程序员烦恼。 他只知道执行上下文在所有地方都可用。

我认为这应该是大家面对的普遍问题,所以请给我一些想法。

以下是问题

MainServer.js app = require('express').createServer(); app_module1 = require('AppModule1'); var session = get_session(); app.get('/my/page', app_module1.func1); AppModule1.js app_module2 = require('AppModule2'); exports.func1 = function(req,res){ // I want to know which the session context this code is running for app_module2.func2(req,res); } AppModule2.js exports.func2 = function(req,res){ // I want to know where the session context in which this code is running } 

您可以使用Domains来实现这个function – 一个新的节点0.8function。 这个想法是在它自己的域中运行每个请求,为每个请求数据提供一个空间。 您可以到达当前请求的域,而无需通过process.domain传递它。

这是一个让它设置为使用express的例子: 如何使用 express 来使用Node.js 0.8.x域?

请注意,一般来说域是实验性的,特别是process.domain是没有文档的(尽pipe在0.8中显然不会消失,并且有一些关于永久性的讨论)。 我build议按照他们的build议,并添加一个特定于应用程序的属性process.domain.data。

https://github.com/joyent/node/issues/3733

https://groups.google.com/d/msg/nodejs-dev/gBpJeQr0fWM/-y7fzzRMYBcJ

由于您使用Express,因此您可以将会话附加到每个请求。 执行如下:

 var express = require('express'); var app = express.createServer(); app.configure('development', function() { app.use(express.cookieParser()); app.use(express.session({secret: 'foo', key: 'express.sid'})); }); 

然后根据每个请求,您可以像这样访问会话:

 app.get('/your/path', function(req, res) { console.log(req.session); }); 

我假设你想为每个会话都有一些独特的标识符,以便你可以跟踪它的上下文。 SessionID可以在我们为每个会话设置的“express.sid”cookie中find。

 app.get('/your/path', function(req, res) { console.log(req.cookies['express.sid']); }); 

所以基本上,你不需要做任何事情,只需添加cookieparsing器并为快速应用程序启用会话,然后当您将请求传递给这些函数时,就可以识别会话ID。 你必须通过这个请求,你不能build立一个只知道会话的系统,因为你正在编写一个服务器,并且可以根据请求提供会话。

什么是expression式,在node.js上构buildhttp堆栈的常用做法是使用http中间件来对从服务器进入callback的请求和响应对象进行“增强”或添加function。 这非常简单直接。

 module.exports = function(req, res, next) { req.session = require('my-session-lib'); next(); }; 

req和res会自动传递到你的处理程序中,并且你需要将它们保持在适当的架构层次上。 在你的例子中,它是这样的:

AppModule2.js

 exports.func2 = function(req,res){ // I want to know where the session context in which this code is running req.session; // <== right here } 

Nodetime是一个分析工具,可以在内部执行你想要做的事情。 它提供了一个函数,以这样的方式处理代码,使得来自特定HTTP请求的调用与该请求相关联。 例如,它了解在Mongo,Redis或MySQL上花费多less时间。 看看网站上的video,看看我的意思是http://vimeo.com/39524802

该库将探针添加到各个模块。 但是,我还没有看到它们之间的上下文(url)是如何传递的。 希望有人可以解决这个问题,并发表解释。

编辑:对不起,我认为这是一个红鲱鱼。 Nodetime正在使用堆栈跟踪将呼叫与另一个相关联。 它提供的结果是可能的多个对相同URL的调用的聚合,所以这不是OP的问题的解决scheme。