【问题标题】:Problem regarding sendRequest in Postman in a for loop关于 for 循环中 Postman 中的 sendRequest 的问题
【发布时间】:2021-08-03 21:17:35
【问题描述】:

我目前正在努力解决有关 Postman Pre-request 脚本中的 pm.sendRequest 的问题。 我正在尝试在 for 循环中运行请求,但它无法正常工作。

预请求脚本

var numberOfCampaigns = 2; //this number can have any value from 1 to 20)
for (var j = 0; j < numberOfCampaigns; j++) {
    console.log(`J1:` + j);
  var request_call = {
    url: pm.environment.get("api-url"),
    method: "POST",
    header: {
      "content-type": "text/xml",
      SOAPAction: "add",
    },
    body: {
      mode: "raw",
      raw: "some-body"},
  };
  pm.sendRequest(request_call, (err, res) => {
    if (err) {
    } else {
      console.log(`J2:` + j);
        length = 2
        for (var i = 0; i < length; i++) {
        pm.environment.set(`someVariable_` + i + `_` + j, responseJson[i]);       
        console.log(`someVariable:`+i+`_`+j+`:`+ pm.environment.get(`someVariable_` + i + `_`+j));
      }
    }
  });
  console.log(`J3:` + j);
}

控制台输出:

J1:0
J3:0
J1:1
J3:1
POST https://api-url/
J2:2
someVariable_0_2:...
someVariable_1_2:...
POST https://api-url/
J2:2
someVariable_0_2:...
someVariable_1_2:...
GET https://api-url2/ (The actual Request)

我不明白为什么 J2 控制台输出为 2 而不是第一个请求为 1 而第二个请求为 2

你能帮忙吗?

更新

@Keith 回复后,我尝试进行一些更改:

var numberOfCampaigns = 2

const _dummy = setInterval(() => {}, 300000 );

function sendRequest(req) {
    
    return new Promise((resolve, reject) => {
        pm.sendRequest(req, (err,res) => {
            if (err) {
                console.log(err);
                return reject(err);
        }
      console.log(`J2:` + j);
      for (let i = 0; i < length; i++) {  
        pm.environment.set(`someVariable_` + i + `_` + j, responseJson[i]);       
        console.log(`someVariable:`+i+`_`+j+`:` + pm.environment.get(`someVariable_` + i + `_`+j));
      }
        return resolve(res);
    })
    });
}

(async function main() {
    for(var j=0; j<numberOfCampaigns; j++){
        var request_call = {
        url: pm.environment.get("api-url"),
        method: "POST",
        header: {
          "content-type": "text/xml",
          SOAPAction: "add",
        },
        body: {
          mode: "raw",
          raw: pm.environment.get(`parameter`+j},
        };
        await sendRequest(request_call);
        clearInterval(_dummy);
    }
})();

【问题讨论】:

  • 添加登录 if(err)。如果它可能会进入。
  • 完成,谢谢@NehaPatil 的建议。

标签: javascript postman web-api-testing postman-pre-request-script


【解决方案1】:

您的脚本是异步的 - pm.sendRequest 发出请求并在请求完成时调用您的回调函数

这可能需要不同的时间。

我希望您的脚本能够启动:

J1:0
J3:0
J1:1
J3:1

因为所有这些都是同步的。

J2: 将在您的 HTTP 请求返回时出现,但到那时您的循环将完成,因此它们都将显示 J2:2

请注意,i 会起作用,因为它在您的回调函数中,并且var j全局 - 除非您使用 let j 和回调,否则 JS 不会对循环或块应用闭包无论如何都会保留对它的引用。

您甚至可能让someVariable 日志乱序,因为请求不会排队 - 无论服务器可能在第一个请求之前完成第二个请求。

避免这种情况的最佳方法是使用awaitPromise.all,以确保在异步操作完成之前,回调之外的 JS 不会运行。

【讨论】:

  • 我明白,但是我如何使用 await 或 Promise 来实现所有这些请求,因为我不是 JS 方面的专家,这对我来说有点困难。我看到 (community.postman.com/t/…) 可以实现,但我不明白在我的情况下如何执行此操作,因为对我而言,每个请求的 sendRequest 数量可能不同。
  • @Paracetamol12 是的,该链接使用await,如果您使用它,则意味着您的循环会暂停(并且不会增加),直到请求完成。 await 听起来是让您的代码工作的最佳方式,但您需要在顶级方法上使用 async
  • ,我用我的更改添加了对原始帖子的更新,但我不明白为什么它只适用于第一个请求然后我收到RefferenceError: j is not defined 然后发送请求将永远加载。我在代码中做错了什么吗?
  • @Paracetamol12 是的,现在var j 在一个函数中,它不再对sendRequest 可见- 向函数sendRequest(req, j) 添加一个参数,然后执行await sendRequest(request_call, j) 传递它。
  • 非常感谢@Keith,我不知道该怎么感谢你,现在一切都很好,在你的建议和从 for 中得到 clearInterval(_dummy) 之后。再次感谢您
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2021-02-06
  • 2020-05-22
  • 1970-01-01
  • 2020-01-27
  • 1970-01-01
  • 2011-07-25
  • 1970-01-01
相关资源
最近更新 更多