[英]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.