https.request在回调下不起作用-nodeJS

时间:2019-08-29 12:46:13

标签: javascript node.js http async.js

我正在使用https库调用Google API。当它作为独立函数调用时,它可以完美工作,但在async.waterfall下不起作用。

我确定,我做错了什么。如果您能指出我的错误,那就太好了。这是代码段:

我也没有看到任何错误。它只是退出程序。 async我有什么问题吗?

 async.waterfall([
  (callback) => {
    console.log("In the first callback");

    const options = {
      host: 'www.googleapis.com',
      path: `/oauth2/v4/token?code=${authorizationCode}&client_id=${clientId}&client_secret=${clientSecret}&redirect_uri=${redirectUri}&grant_type=${grantType}`,
      port: 443,
      method: 'POST',
      headers: {
        'Content-Type': 'application/x-www-form-urlencoded'
      }
    };

    const req = https.request(options, (res) => {
      console.log("Inside Request - response came");
      console.log(`statusCode changed: ${res.statusCode}`);

      let geoData = [];
      res.on('data', (d) => {
        geoData.push(d);
      });

      res.on('end', () => {
        try {
          geoData = JSON.parse(Buffer.concat(geoData).toString());
          console.log(geoData);

          const response = {
            statusCode: res.statusCode,
            body: JSON.stringify(geoData),
          };

          return callback(null, response);
        } catch (error) {
          return callback(error);
        }
      });
    });

    req.on('error', (e) => {
      return callback(e.message);
    });

    req.end();

    console.log("End of first callback");
  }
], (err, result) => {
    if (err) {
      return err;
    }
    return result;
});

谢谢。

1 个答案:

答案 0 :(得分:1)

由于NodeJ的异步类型以及编写函数的方式,req.end()在响应到达之前正在执行。在req.end()req.on(...)中移动res.on()。您只希望在收到响应或错误后结束请求。此外,您应该在return callback()内添加res.on('data'),以便通知异步函数已完成执行