【问题标题】:Two Calls to NodeJS Server are Interfering with one another对 NodeJS 服务器的两次调用相互干扰
【发布时间】:2017-09-20 04:33:56
【问题描述】:

Node.JS 相对较新,并且有一个使用 http.createServer 侦听端口 8081 的简单服务器。它侦听来自简单网页的 Ajax 调用。让节点按预期收听和响应请求没有问题。不过,我遇到的一个问题是,当我通过另一个浏览器实例或在另一台机器上同时向同一节点引入第二个请求时,第二个请求会根据第一个调用参数产生结果。

在调试服务器时,我可以看到两个请求按预期带有不同的参数,但就好像第二个请求覆盖了第一个请求。来自 .NET 背景,我最初认为我有在调用之间共享的全局变量 - 但我已经消除了所有全局变量。

在保持两个单独的节点调用完全唯一的过程中,我是否遗漏了一些令人痛苦的显而易见的事情?

以下是我正在使用的代码,...(发布较晚)

var http = require("http"),
    url = require('url');

http.createServer(function(request, response) {
    var Params = url.parse(request.url, true).query;
    var CallSettings = Defaults();
    CallSettings.Location = Params.Location;
    CallSettings.Threshold = Params.Threshold;
    CaptureDataFromHost(request, response, CallSettings);

}).listen(8081);

function CaptureDataFromHost(request, response, CallSettings) {
    try {
        for (var Page = 0; Page < Pages; Page++) {
            var http = require("http"),
                url = require('url');
            var RequestString = '';
            var request = require('request');
            request(RequestString, function(error, response2, body) {
                if (!error && response2.statusCode == 200) {
                    var ResponseAsObject = JSON.parse(body);
                    CallSettings.ResponseCount++;
                    for (var i = 0; i < ResponseAsObject.products.length; i++) {
                        // various local business logic here,...
                    }

                    // If it is the last page response, run aggregate data,...
                    if (CallSettings.ResponseCount == CallSettings.Pages) {
                        AggregateAllProductData(response, Location,
                            CallSettings);
                    }
                }
            })
        }
    }
    catch (err) {
        console.log(err);
    }
}

【问题讨论】:

  • 添加代码较晚!
  • 循环的每次迭代都不需要 http 和 url,它们已经在外部范围中定义了
  • 另外,您正在通过需要一个请求模块来覆盖 CaptureDataFromHost 的请求参数,这是行不通的

标签: javascript mysql node.js web


【解决方案1】:

需要循环... ARGH!!

正如@PatrickHund 所说:第二次需要请求模块是您正在寻找的明显问题。

始终在脚本开头需要您的模块!如果这仍然不起作用,我也想知道什么是 Default() (l. 6)

【讨论】:

    【解决方案2】:

    这里只是更新。是的,循环中的要求是一个问题。但是造成呼叫干扰的问题是“默认”声明:

    var CallSettings = Defaults();

    应该是 var CallSettings = new Defaults();

    通过添加这个,每个调用都有自己独特的确定对象。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2021-04-08
      • 1970-01-01
      • 2013-05-27
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-04-27
      相关资源
      最近更新 更多