Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/437.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 获取执行上下文的Node.js编程模式_Javascript_Design Patterns_Node.js_Express - Fatal编程技术网

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

Javascript 获取执行上下文的Node.js编程模式,javascript,design-patterns,node.js,express,Javascript,Design Patterns,Node.js,Express,我正在node.js中编写一个web应用程序。现在,服务器上的每个处理都始终在会话的上下文中,在请求到达服务器的第一个阶段检索或创建会话。在此之后,执行将流经多个模块并在其中回调。我正在努力创建一个编程模式,这样在代码中的任何一点上会话对象都是可用的,而程序员不需要在每次函数调用中将其作为参数传递 如果所有代码都在一个文件中,我可能会有一个闭包,但是如果在其他文件中有对其他模块的函数调用,我如何编程,以便会话对象在被调用函数中可用,而不将其作为参数传递。我觉得这两个文件中的两个函数之间应该有一些

我正在node.js中编写一个web应用程序。现在,服务器上的每个处理都始终在会话的上下文中,在请求到达服务器的第一个阶段检索或创建会话。在此之后,执行将流经多个模块并在其中回调。我正在努力创建一个编程模式,这样在代码中的任何一点上会话对象都是可用的,而程序员不需要在每次函数调用中将其作为参数传递

如果所有代码都在一个文件中,我可能会有一个闭包,但是如果在其他文件中有对其他模块的函数调用,我如何编程,以便会话对象在被调用函数中可用,而不将其作为参数传递。我觉得这两个文件中的两个函数之间应该有一些联系,但如何安排这一点正是我遇到的问题

一般来说,我想说的是,执行上下文可以是会话或网络请求,其处理分布在多个文件中,并且执行上下文对象在所有点都可用。实际上可以有多个用例,比如每个网络请求有一个日志对象,或者每个会话有一个日志对象。而实现这一功能所需的管道应该安装在侧面,而不让应用程序程序员为此烦恼。他只知道执行上下文在任何地方都是可用的

我认为这应该是每个人都面临的一个相当普遍的问题,所以请给我一些想法

以下是问题

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

    }

因为您使用的是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中找到

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

因此,基本上,你不必做任何其他事情,只需为你的express应用程序添加cookie解析器和启用会话,然后当你将请求传递给这些函数时,你就可以识别会话ID。不过,你必须传递请求,您无法构建一个只知道会话的系统,因为您正在编写服务器,并且会话可以根据请求使用

express的功能,以及在node.js上构建http堆栈的常见做法是使用http中间件“增强”或向从服务器进入回调的请求和响应对象添加功能。这是非常简单和直接的

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

}
exports.func2=函数(req,res){
//我想知道运行此代码的会话上下文的位置
req.session;//是一个分析工具,它在内部执行您试图执行的操作。它提供了一个函数,用于对代码进行插入,从而使特定HTTP请求产生的调用与该请求相关联。例如,它了解一个请求在Mongo、Redis或MySQL中花费了多少时间。请看视频在网站上看到我的意思

这个库向不同的模块添加了探测。但是,我还没有看到上下文(url)是如何在它们之间传递的。希望有人能弄明白这一点并给出解释


编辑:很抱歉,我认为这是一个转移注意力的问题。Nodetime使用堆栈跟踪将调用彼此关联。它显示的结果是对同一URL的潜在多个调用的聚合,因此这不是OP问题的解决方案。

您可以使用域来实现这一点——一个新的节点0.8功能。其思想是o在每个请求自己的域中运行每个请求,为每个请求的数据提供一个空间。您可以访问当前请求的域,而无需通过process.domain将其全部传递

下面是一个使用express进行it设置的示例:

请注意,域通常是一些实验性的,尤其是process.domain是没有文档记录的(虽然在0.8中显然没有消失,并且有一些关于将其永久化的讨论)。我建议遵循他们的建议,并向process.domain.data添加一个特定于应用程序的属性


您正在使用req作为传递执行上下文数据的载体。这不是我要寻找的。在更一般的层面上,我希望完全替换函数中的参数,并在文件中使用常量名称,当使用该名称时指向正确的对象。因此,如果我在文件的任何位置执行req.something,它将是c更正req对象,因为它会自动传递给整个系统,而不是为此编写整个系统。在这里,您应该使用@Raks。问题是您将每个文件或全局的概念与每个请求混淆。在节点中,以及通常基于事件的网络中,请求是上下文。否则,无法区分是什么(人工构造)你正在引用,你得到了竞争。节点既不是PHP也不是Rails,整个解释器在请求之间生存,就像全局作用域一样。你会注意到你在这里传递请求和响应。OP是关于不需要将这些东西传递到每个模块。如果你找到了一种方法,请回答你自己的问题。Dom现在不推荐使用AIN。