【问题标题】:How to store variable per Http request如何存储每个 Http 请求的变量
【发布时间】:2020-01-17 02:35:50
【问题描述】:

我正在制作一个非常简单的 nodejs 应用,用于接收 HTTP 请求和响应。

简而言之,是否可以为每个 HTTP 请求全局存储一个变量?所以,我不需要在我的应用程序的任何地方传递该变量。我知道有process.env。但是,如果另一个请求同时出现,它将被覆盖。

我需要这个的原因是我想记录每个请求。由于 JavaScript 是一个异步程序,所以当我查看日志时它是如此令人困惑。

例如:

  1. 收到请求(第一个请求)
  2. 收到请求(第二次请求)
  3. 处理结果为 zzzzzzz
  4. 处理结果为 yyyyyyy

那么,第 4 行的处理结果是属于 First Request 还是 Second Request?

我的代码示例

//In Init.js 
var process = require("process");
http.createServer(function (request, res){
    Console.log("Request Received");
    //Parse the request
    //Generate a unique ID for the requests
    var RequestID = UUID();
    console.log("Request ID is "+ RequestID);  // I don't want to pass this via function parameter as there are so many function involved. 

    process.handler(Request);
}

//In process.js
function handler(Request){
    //do sth with DB / API call and generate the result.
    //the time required is various. 
    console.log("Process result is" + result);
}

【问题讨论】:

标签: javascript node.js logging


【解决方案1】:

我建议使用 http 请求上下文包来完成您想要做的事情。看这里:https://www.npmjs.com/package/http-request-context

【讨论】:

  • 异步钩子,是一个很好的解决方案,但是它可能会导致性能问题,请参阅dzone.com/articles/…
【解决方案2】:

如果您对“污染”您不拥有的东西没有异议,您可以随时将标识符放到请求中:

http.createServer(function (request, res){
    var requestID = UUID();
    console.log("Request ID is "+ requestID);
    request.requestId = requestID;
    process.handler(request, res);
}

然后您可以再次将其拉下以使用它:

myModule.action(request, response, next) {
    console.log("[" + request.requestId + "]: I made it!");
    next();
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2018-12-16
    • 1970-01-01
    • 1970-01-01
    • 2019-07-26
    • 1970-01-01
    • 1970-01-01
    • 2013-02-02
    • 2019-12-24
    相关资源
    最近更新 更多