如何在node.js中存储请求级变量?

时间:2012-06-11 15:50:19

标签: node.js

对于只需要在单个请求期间可用的数据,应该在哪里存储? 我正在req和res对象上创建新属性,所以我不必将该数据从函数传递给函数。

req.myNewValue = 'just for this request'

进程对象是一个选项吗?或者它是否在所有请求中全局共享?

4 个答案:

答案 0 :(得分:14)

在Express 4中,最佳做法是在res.locals上存储请求级别变量。

  

包含作用域的响应局部变量的对象   请求,因此仅适用于在期间呈现的视图   请求/响应周期(如果有)。否则,这个属性是   与app.locals相同。

     

此属性对于公开请求级别信息非常有用,例如   请求路径名,经过身份验证的用户,用户设置等。

app.use(function(req, res, next){
  res.locals.user = req.user;
  res.locals.authenticated = ! req.user.anonymous;
  next();
});

process对象由所有请求共享,不应按请求使用。

答案 1 :(得分:12)

如果你在谈论像这里传递的变量:

http.createServer(function (req, res) {
    req.myNewValue = 'just for this request';
    res.writeHead(200, {'Content-Type': 'text/plain'});
    res.end('Hello World\n');
}).listen(1337, '127.0.0.1');

然后你正在做的事情非常好。 req存储请求数据,您可以根据需要进行修改。如果你使用像Express这样的框架,那么它也应该没问题(请记住,你可以覆盖req对象的一些内置属性。)

如果通过“过程对象”引用全局变量process,那么绝对不行。这里的数据是全局的,根本不应该修改。

答案 2 :(得分:2)

如果要在异步回调中保留数据,可能存在请求和响应对象不可用的情况。所以在这种情况下continuation-local-storage包是有帮助的。

它用于从不易访问的点访问数据或当前的快速请求/响应。它使用命名空间的概念。

以下是我如何设置

安装continuation-local-storage

npm install continuation-local-storage --save

创建命名空间

let app = express();
let cls = require('continuation-local-storage');
let namespace = cls.createNamespace('com.domain');

然后是中间件

app.use((req, res, next) => {
   var namespace = cls.getNamespace('com.domain');
   // wrap the events from request and response
   namespace.bindEmitter(req);
   namespace.bindEmitter(res);

   // run following middleware in the scope of the namespace we created
   namespace.run(function () {
      // set data on the namespace, makes it available for all continuations
      namespace.set('data', "any_data");
      next();
   });
})

现在,在任何文件或函数中,您都可以获取此命名空间并使用其中保存的数据

//logger.ts

var getNamespace = require("continuation-local-storage").getNamespace;
let namespace = getNamespace("com.domain");
let data = namespace.get("data");
console.log("data : ", data);

答案 3 :(得分:0)

不,它不会与所有请求一起共享,只会在该请​​求中持续很长时间。