簡體   English   中英

請求模塊:這是用不同主體發出連續POST請求的正確方法嗎?

[英]Request module: Is this the correct way to make consecutive POST requests with different body's?

因此,我正在使用NodeJs的“請求”模塊發出多個發布請求,感覺好像我做錯了。 有沒有更好的方法來解決這個問題?

可以說我需要發送一系列不同的JSON主體。

        var requests = [
                {
                    "Subject": "TestSubject1",
                    "Body": "TestBody1",
                    "PreferredLanguage": "en-US",
                    "Recipients": [
                        {
                            "FirstName": "TestName1",
                            "EmailAddress": "TestEmail1"
                        }
                    ]
                },
                {
                    "Subject": "TestSubject2",
                    "Body": "TestBody2",
                    "PreferredLanguage": "en-US",
                    "Recipients": [
                        {
                            "FirstName": "TestName2",
                            "EmailAddress": "TestEmail2"
                        }
                    ]
                },
                {
                    "Subject": "TestSubject3",
                    "Body": "TestBody3",
                    "PreferredLanguage": "en-US",
                    "Recipients": [
                        {
                            "FirstName": "TestName3",
                            "EmailAddress": "TestEmail3"
                        }
                    ]
                }
            ]

這是我嘗試執行的操作。

         for(var i = 0; i < requests.length; i++){
                request.post(
                    {
                        url: 'https://testURL.com/messages',
                        json: requests[i],
                        method: 'POST'
                    },
                    function (e, r, body) {
                        console.log(body);
                    }
                )
            }

我覺得這是解決此問題的非常不好的方法。 正確的方法是什么?

你可以那樣做。 一般來說,您希望避免進行大量的HTTP調用,因此,如果您能夠編輯向其發出請求的API,則可以將端點更改為采用一個數組(您當前的requests數組)並返回所需的任何內容所有這些都在一個HTTP請求中。

您不應盲目地向服務器發出數百個並行請求。

您應該限制對服務器的並行請求數,否則服務器可能會關閉或服務器也可能阻止您

在這種情況下,我個人使用了節點async模塊的eachLimit函數。

以下是工作代碼

const async = require('async');
const request = require('request');
var limit = 2 //max 2 parallel request at time

var requests = [
    {
        "Subject": "TestSubject1",
        "Body": "TestBody1",
        "PreferredLanguage": "en-US",
        "Recipients": [
            {
                "FirstName": "TestName1",
                "EmailAddress": "TestEmail1"
            }
        ]
    },
    {
        "Subject": "TestSubject2",
        "Body": "TestBody2",
        "PreferredLanguage": "en-US",
        "Recipients": [
            {
                "FirstName": "TestName2",
                "EmailAddress": "TestEmail2"
            }
        ]
    },
    {
        "Subject": "TestSubject3",
        "Body": "TestBody3",
        "PreferredLanguage": "en-US",
        "Recipients": [
            {
                "FirstName": "TestName3",
                "EmailAddress": "TestEmail3"
            }
        ]
    }
]

function iteratee(requestBody, cb) {
//this will be called for each item in the requests array
    console.log("request processing starts")
    request.post({
            url: 'https://testURL.com/messages',
            json: requestBody,
            method: 'POST'
        },
        function (e, r, body) {
            console.log(e);
            console.log(body);
            cb();
            console.log("request processing ends")
        });
}

function finalCallback(err) {
    //this will be called when all the requests are processed
}

async.eachLimit(requests, limit, iteratee, finalCallback)

一切取決於您的意圖:

如果您需要分別處理請求的結果 (所有請求都是異步的,並將分別由傳遞的回調函數處理),則可以。

但是, 當我們所有的請求都完成后,您通常需要采取最后的行動 您可以為此使用Promise.all

例如:

require("request/package.json"); // request is a peer dependency.
const requestPromiseAny = require("request-promise-any");

const requests = [
  {
    "name": "morpheus",
    "job": "leader"
  },
  {
    "name": "tom",
    "job": "leader"
  }
];
Promise.all(requests.map((requestJSON) => {
  return requestPromiseAny.post(
    {
      url: 'https://reqres.in/api/users',
      json: requestJSON,
      method: 'POST'
    });
})).then((responses) => {
  console.log(responses);
});

您可以在runkit上輕松嘗試它。

暫無
暫無

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

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