Nodejs 在获取 api 请求后写入请求 url、同步响应文件时出现问题



我在StackOverflow帖子上搜索了很多,并且能够找出我的程序达到这个级别,但是,我无法继续前进。如果您可以提供建议,则需要您的建议。

我正在运行一个 get API,通过使用 URL 数组一个接一个地接收 2 个请求 URL,并使用 for 循环来处理每个 URL 并将其发送到 request.get 并能够在控制台中看到响应。

但是,当我尝试使用测试用例名称数组中的测试用例名称连续编写请求 URL 及其对文件的相应响应时,问题在于。

它只使用 TC2_reqres.json 写入文件并放置第一次调用的请求响应。

期待这样的事情

TC1_reqres.json 包含/people/1 响应TC2_reqres.json 包含/people/2 响应

请指教。

谢谢!提前给大家很多。

var request = require("request");
var fs = require('fs');
describe('testsuite', function () {
  it("test case", function (done) {
    var urlarr = ["https://swapi.co/api/people/1", "https://swapi.co/api/people/2"];
    var tcnamearr = ["TC1", "TC2"];
    var respath = "C:/Study_JSR/capi/tests/Res/";
    for (var i = 0; i < tcnamearr.length; i++) {
      url = urlarr[i];
      tcname = tcnamearr[i];
      request.get({ url: url, "rejectUnauthorized": false, "json": true }, function (e, r, user) {
        resbod = JSON.stringify(user);
        console.log("resbod: " + resbod);
        fs.writeFileSync(respath + tcname + "_reqres.json", resbod);
      })
    }
    done();
  });
});

尝试而不是var使用let

for (let i = 0; i < tcnamearr.length; i++) {

Javascript 在闭包和异步调用方面有奇怪的行为。for循环在调用回调之前完成,因此tcname的值始终为"TC2"。您应该尝试重构代码。使用 axios 而不是 request 。它支持承诺,在这些情况下更好。

一种可能的解决方案是:

var request = require("axios");
var fs = require('fs');
describe('testsuite', function () {
  it("test case", function (done) {
    var respath = "C:/Study_JSR/capi/tests/Res/";
    var gets = [
      request.get({ url: "https://swapi.co/api/people/1", "rejectUnauthorized": false, "json": true }),
      request.get({ url: "https://swapi.co/api/people/2", "rejectUnauthorized": false, "json": true })
    ]
    Promise.all(gets).then(function(res) {
      fs.writeFileSync(respath + "TC1" + "_reqres.json", res[0].body)
      fs.writeFileSync(respath + "TC2" + "_reqres.json", res[1].body)
    })
    done();
  });
});

这只是一个起点,如果需要,您可以删除重复项。

最新更新