在获取api请求后,Nodejs发出写入请求url,同步响应文件的问题

时间:2018-04-18 01:59:39

标签: javascript node.js

我在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();
  });
});

2 个答案:

答案 0 :(得分:0)

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();
  });
});

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

答案 1 :(得分:0)

尝试使用var而不是let来使用for (let i = 0; i < tcnamearr.length; i++) {

SELECT SUM(last_access_date > CURDATE() and last_access_date < CURDATE()+1) as CURDATE(), SUM(last_access_date > CURDATE()-1 and last_access_date < CURDATE()) as CURDATE()-1, SUM(last_access_date > CURDATE()-2 and last_access_date < CURDATE()-1) as CURDATE()-2, SUM(last_access_date > CURDATE()-3 and last_access_date < CURDATE()-2) as CURDATE()-3, SUM(last_access_date > CURDATE()-4 and last_access_date < CURDATE()-3) as CURDATE()-4, SUM(last_access_date > CURDATE()-5 and last_access_date < CURDATE()-4) as CURDATE()-5, SUM(last_access_date > CURDATE()-6 and last_access_date < CURDATE()-5) as CURDATE()-6 FROM MYTABLE