簡體   English   中英

如何使用node.js執行多個http請求

[英]How to perform several http requests with node.js

我需要執行幾個http請求。 我有一個url數組,當每個請求完成時, JSON object被推入一個數組。 當所有請求完成后, JSON object將使用新構造的Array發送到客戶端。 如果我在做這個客戶端,我會使用類似jQuery的Deferred對象。 是否有另一種方法使用node.js而不必import jQuery's Deferred object 似乎不會使用事件發射器來處理這個問題。 或者是嗎? 謝謝!

確保首先在Node.js中允許多個連接

require('http').globalAgent.maxSockets = 1000

此代碼段允許您的Node.js服務器為每個客戶端接受1000個http請求。


Node.js中有許多流控制庫。

着名的是異步步驟

我個人更喜歡async ,因為它具有類似於下划線lodash的功能,但它的異步版本。

這是一個可能的解決方案。

該類擴展了EventEmitter。 它的作用是對每個異步請求響應,我們發出已完成的異步請求的計數並存儲響應的主體。

var UrlHandler, events, request, urlHandler,
  __hasProp = {}.hasOwnProperty,
  __extends = function(child, parent) { for (var key in parent) { if (__hasProp.call(parent, key)) child[key] = parent[key]; } function ctor() { this.constructor = child; } ctor.prototype = parent.prototype; child.prototype = new ctor(); child.__super__ = parent.prototype; return child; };

events = require("events");
request = require("request");

UrlHandler = (function(_super) {
  __extends(UrlHandler, _super);

  function UrlHandler() {
    return UrlHandler.__super__.constructor.apply(this, arguments);
  }

  UrlHandler.prototype.getUrls = function(urls) {
    var processedUrls, url, urlhandler, _i, _len, _results;
    processedUrls = 0;
    urlhandler = this;
    urlhandler.urlResponse = [];
    _results = [];
    for (_i = 0, _len = urls.length; _i < _len; _i++) {
      url = urls[_i];
      _results.push(request({
        uri: url
      }, function(error, response, body) {
        urlhandler.urlResponse.push(response);
        processedUrls++;
        return urlhandler.emit("processed:" + processedUrls);
      }));
    }
    return _results;
  };

  return UrlHandler;

})(events.EventEmitter);

urlHandler = new UrlHandler();

module.exports = {
  urlHandler: urlHandler
};

然后在你的主應用程序中,我們將監聽器設置為'processed:' + urls.length這樣一旦完成所有異步請求,它就會觸發。

urls = ['http://stackoverflow.com/questions/12739605/how-to-perform-several-http-requests-with-node-js', 'http://stackoverflow.com'];

UrlHandler.getUrls(urls);
UrlHandler.once("processed:" + urls.length, function() {
  return res.json(UrlHandler.urlResponse);
});

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM