![](/img/trans.png)
[英]File submission using form-data and axios on node.js doesn't work
[英]Chaining API requests with Axios in Node.js in a loop - doesn't work in order
已编辑:尝试了以下建议以及更多内容,现在这是代码,我几乎只是将其全部设为异步等待而不是然后捕获...
makeNextAccount();
console.log("Making :" + merchantsToCreate.length + " Accounts")
async function makeNextAccount(currentIndex) {
for (const item of merchantsToCreate) {
try{
let accId = "";
var createAccBody = JSON.stringify(
{
"email":emails[item],
"firstName":"sdd",
"lastName":"dgdg"
});
var createAcc = {
method: 'post',
url: url1,
headers: awsHeaders,
data : createAccBody
};
const createdAccResult = await axios(createAcc); // wait for the request to finish
await Promise.all(createdAccResult);
console.log('Done!');
accId = createdAccResult.data.accountId;
console.log(JSON.stringify("ACCOUNT CREATED:" + accId));
} catch(err) {
console.log("ERROR Create acc:" + err );
}
try{
var initUnAuthBody = JSON.stringify(
{
"accountId": accId
});
var initUnAuth = {
method: 'post',
url: url2,
headers: awsHeaders,
data : initUnAuthBody
};
const initUnAuthResult = await axios(initUnAuth); // wait for the request to finish
console.log(JSON.stringify("Init unAuth for:" +accId+", with response:" + initUnAuthResult.status));
}catch(err) {
console.log("ERROR unautinit:" + err);
}
try{
var provisionBody = JSON.stringify(
{
"name": accId,
"active": "1"
});
var provision = {
method: 'post',
url: url3,
headers: awsHeaders,
data : provisionBody
};
const provisionResult = await axios(provision); // wait for the request to finish
console.log(JSON.stringify("Provision for:" + accId+", with response:" + provisionResult.status));
}catch(err) {
console.log("ERROR provision:" + err);
}
try{
var salesForceRecordody = JSON.stringify(
{
"email": emails[item],
"accountId": accId,
});
var salesForceRecord = {
method: 'post',
url: url4,
headers: awsHeaders,
data : salesForceRecordody
};
const salesForceRecordResult = await axios(salesForceRecord); // wait for the request to finish
console.log(JSON.stringify("SalesForce Record for:" +accId+", with response:" + salesForceRecordResult.status));
accCreatedList.push(accId); // Push to created list only when all steps are done
}catch(err) {
console.log("ERROR Salesforce:" + err);
}
}
}
结果是,如您所见,返回一个 400 错误,但我不知道在 axios 中使用异步等待时如何从服务器获得完整响应,它在使用 then 和 catch 时很容易显示,但我只能得到这个简单的回应。
在控制台中打印正文/标题时,一切似乎都很好,这与我之前所做的请求相同,但由于某种原因在这里失败了......
Making :3 Accounts
ERROR Create acc:Error: Request failed with status code 400
ERROR unautinit:Error: Request failed with status code 400
ERROR provision:Error: Request failed with status code 400
ERROR Salesforce:Error: Request failed with status code 400
ERROR Create acc:Error: Request failed with status code 400
ERROR unautinit:Error: Request failed with status code 400
ERROR provision:Error: Request failed with status code 400
ERROR Salesforce:Error: Request failed with status code 400
ERROR Create acc:Error: Request failed with status code 400
ERROR unautinit:Error: Request failed with status code 400
ERROR provision:Error: Request failed with status code 400
ERROR Salesforce:Error: Request failed with status code 400
使用 async/await 这相对简单:
for(...) {
const result = await axios(...); // wait for the request to finish
// do something with your result
}
基本上,您需要让您的 function 返回 axios 正在创建的 Promise。 很难用样本的间距来判断,但看起来只需在这一行添加一个return
就可以了:
return axios(createAcc)
然后,而不是使用setTimeout
和循环,您需要进行第一次调用,等待它完成,然后在then()
方法中,如果有的话,进行下一次调用:
var merchantsToCreate = getFromSomewhere();
var currentIndex = 0;
function makeNextAccount() {
if (currentIndex < merchantsToCreate.length - 1) {
currentIndex++;
accountCreationFlow(merchantsToCreate[i], emails[i])
.then(makeNextAccount); // <- will make the next account
}
}
makeNextAccount(); // kick off the "loop"
我能够用来解决这个问题的唯一解决方案是:
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.