Node.js Javascript范围问题
我有一个Node.js HTTP服务器正在运行,如下所示(简化): “帮助”是一组功能帮助程序,例如:Node.js Javascript范围问题,javascript,node.js,scope,Javascript,Node.js,Scope,我有一个Node.js HTTP服务器正在运行,如下所示(简化): “帮助”是一组功能帮助程序,例如: module.exports.run = { joinObjects: function(obj1, obj2) { for (var prop in obj2) { obj1[prop] = obj2[prop]; } return obj1; } } “路由器”处理请求(进一步向下传递请求并处理对客户端的响应): “handler”模块/函数
module.exports.run = {
joinObjects: function(obj1, obj2) {
for (var prop in obj2) {
obj1[prop] = obj2[prop];
}
return obj1;
}
}
“路由器”处理请求(进一步向下传递请求并处理对客户端的响应):
“handler”模块/函数运行回调函数并将响应(代码、头和数据)传递给回调函数。回调函数然后将头与配置文件中设置的一组默认头合并
问题:当有两个连接同时调用help.joinObjects()
时(我猜是这样),response.headers
属性与另一个用户/连接发生冲突并返回错误数据。如果我注释掉进行合并的行,则不会发生这种情况
问题:我的“帮助”模块方法有什么问题?这里有一些我不理解的范围问题。正如懒汉所指出的,问题在于我将对象传递到helper函数的顺序:
help.joinObjects(config.responseHeaders,response.headers)
Javascript通过引用传递变量,因此每次调用
help.joinObjects()
时,它都会覆盖config属性,而不是用户特定的对象。可能是因为您将响应中的头合并到配置中了吧?更改help.joinObjects(config.responseHeaders、response.headers)
到help.joinObjects(response.headers、config.responseHeaders)代码>解决你的问题?嘿!不,这不是问题所在。最后一个headers
属性包含应该发送回完全不同的客户端(可怕!)的头。它们不是来自配置文件。问题在于,一些被认为是客户端唯一的数据实际上被两个(或更多)客户端共享,而这两个客户端恰好同时发送请求。我原以为所有的东西都封装得很好,不能在不同的连接之间共享,但事实证明并非如此。但是js是在单线程中运行的,所以没有竞争条件。你确定我的建议没有用吗?(很抱歉再次询问:))我无法使用您的修复程序重现此问题,而我的版本仍存在此问题。因此,你的建议可能已经解决或隐藏了问题,但问题是-如何解决?。。在某些情况下,两个不同的用户连接必须访问与config.responseHeaders
或response相同的作用域。返回时,标题包含可以在浏览器中检测到的标题。这个特定的头文件是从一个单独的模块返回的,我当时没有访问这个模块。所以我很确定代码中存在范围问题。好的,明白了!config位于全局(或顶部,无所谓)中,因为JavaScript通过引用传递变量,所以每次调用我的joinObjects函数时都会修改全局对象的属性(即-config属性)。我的错:(
module.exports.run = {
joinObjects: function(obj1, obj2) {
for (var prop in obj2) {
obj1[prop] = obj2[prop];
}
return obj1;
}
}
module.exports.run = function(req, res) {
var urlPath = url.parse(req.url).pathname;
switch(urlPath) {
case '/something':
requestHandler(req, res, 'something');
break;
...
}
function requestHandler(req, res, handler) {
var data = '';
req.on('data', function(chunk) {
data += chunk;
}
req.on('end', function() {
m[handler].run(req, data, function(response) {
response.headers = help.joinObjects(config.responseHeaders, response.headers);
res.writeHead(response.code, response.headers);
res.end(response.data);
});
}
}
}