Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/node.js/36.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
在Node.js Express中的任何位置访问当前req对象_Node.js_Express - Fatal编程技术网

在Node.js Express中的任何位置访问当前req对象

在Node.js Express中的任何位置访问当前req对象,node.js,express,Node.js,Express,如果回调中没有'req'参数,我想知道如何访问req对象 这就是场景: 在ExpressJs中,我有一个公共函数,它用于处理带有'req'对象的内容,但不将req传递给它 module.exports = { get: function(){ var req = global.currentRequest; //do something... } } 我目前的解决方案是为所有请求编写一个中间件,我将'req'放入全局变量中,然后我可以使用'glo

如果回调中没有'req'参数,我想知道如何访问req对象

这就是场景:
在ExpressJs中,我有一个公共函数,它用于处理带有'req'对象的内容,但不将req传递给它

module.exports = {
    get: function(){
        var req = global.currentRequest;
        //do something...
    }
}
我目前的解决方案是为所有请求编写一个中间件,我将'req'放入全局变量中,然后我可以使用'global.currentRequest'访问任何地方的'req'

// in app.js
app.use(function (req, res, next) {
    global.currentRequest= req;
    next();
});
但我不知道它是否好?有人能提出建议吗?

非常感谢

唯一正确的方法是将
req
对象作为参数传递给所有需要它的函数

将其存储在全局中根本不起作用,因为如果任何请求在处理过程中使用异步调用,则多个请求可能同时处于处理过程中,并且这些多个请求将相互践踏,从而难以跟踪错误。这里没有捷径。将当前请求作为参数传递给任何需要它的代码

您永远不能将特定于请求的数据放入node.js中的全局文件中。这样做将为同时进行的两个请求创造一个相互践踏的机会,并使数据在请求之间混淆。请记住,这是一个服务器,可能会处理许多客户端的请求。不能对服务器使用同步、一次一个的思维方式。一个node.js服务器可能会同时有许多请求,因此普通全局变量不能用于请求特定的数据

这里没有捷径。您只需将
req
对象传递给需要它的函数即可。如果这意味着您必须更改几个中间函数的函数签名,那么就这样吧。这就是你必须做的。这是解决这类问题的唯一正确方法


在某些情况下,您可能可以使用闭包“捕获”所需的
req
对象,然后在内部函数中使用它,而无需将其传递给这些内部函数,但听起来这并不是您的函数结构。我们必须看到更多的真实/实际代码,才能知道这是否有可能。

实际上,这是可能的


这是一种允许您跨异步任务持久化变量的方法。

除非您真的没有选择余地,否则请避免使用全局变量。这被认为是一种反模式。请参阅:唯一正确的方法是将
req
作为参数传递给所有需要它的函数。将其存储在全局中根本不起作用,因为如果任何请求在处理过程中使用异步调用,则多个请求可能同时处于处理过程中,并且这些多个请求将相互践踏,从而难以跟踪错误。这里没有捷径。将当前请求作为参数传递给任何需要它的代码。此外,在堆栈上讨论了数百次,您将无法找到合适的解决方案。问题是您试图将同步思想应用于异步编程。在电影中,功夫大师经常说你必须改变你的思维方式。#jfriend00和@boris siscanu你对向nodejs大师分会承诺有什么看法?是一种单线程语言的线程本地存储。这打开了在同步编程语言中广为人知的新功能,如:依赖项注入或更好的记录器。@JRichardsz-这是一种解决类似问题的替代方法。根据我读过的几篇文章,这个概念是可行的,但它存在重大的性能问题,一小部分人希望最终解决这些性能问题,但还没有真正取得多大进展。以下是一些参考资料:和。