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