请求模块:这是使用不同正文发出连续 POST 请求的正确方法吗?



,所以我正在使用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);
                    }
                )
            }

我觉得这是解决这个问题的一种非常糟糕的方式。正确的方法是什么?

全部取决于您的意图:

如果您需要分别(所有请求都是异步的,并且将通过传递的回调函数进行处理(。

,但是通常您需要完成我们所有请求完成时做出最终操作。您可以使用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上轻松尝试。

您可以那样做。一般而言,您想避免拨打大量的HTTP调用,因此,如果您有能力编辑请求的API,则可以更改端点以使用数组(您的当前requests数组(并返回所需的任何内容一项http请求。

您不应该盲目地向服务器提出数百个并行请求。

您应该对服务器的并行次数限制其他明智的服务器可能会下降,否则服务器可能会阻止您

我个人在这些类型的情况下个人使用了节点async模块的每个限制功能。

以下是工作代码

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)

最新更新