2017-04-23 30 views
0

Node.JS相對較新,並且使用監聽端口8081上的http.createServer的簡單服務器。它監聽來自簡單網頁的Ajax調用。沒有問題讓節點按預期收聽和響應請求。但我遇到的一個問題是,當我通過另一個瀏覽器實例或另一臺機器同時向同一節點引入第二個請求時,第二個請求會根據第一個調用參數生成結果。對NodeJS服務器的兩次調用互相干涉

在調試服務器時,我可以看到兩個請求都按照預期使用不同的參數進入,但它好像第二個請求覆蓋了第一個請求。來自.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); 
    } 
} 
+0

延遲添加代碼! – Spades

+0

無需在循環的每次迭代中都需要http和url,它們已經在外部作用域 –

+0

中定義,您還需要請求模塊覆蓋CaptureDataFromHost的請求參數,這將不起作用 –

回答

0

要求在環......哎呀!

正如@PatrickHund所說:第二次請求請求模塊是您正在尋找的明顯問題。

始終需要您的模塊在您的腳本的開始!如果這仍然不起作用,我也想知道什麼是Default()(l.6)

0

只是在這裏更新。是的,循環中的需求是一個問題。但是造成通話干擾的問題是'默認'聲明:

var CallSettings = Defaults();

應該是var CallSettings = new Defaults();

通過添加這個,每一個調用都有它自己獨特的權威對象。