我正在使用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;
});
谢谢。
答案 0 :(得分:1)
由于NodeJ的异步类型以及编写函数的方式,req.end()
在响应到达之前正在执行。在req.end()
和req.on(...)
中移动res.on()
。您只希望在收到响应或错误后结束请求。此外,您应该在return callback()
内添加res.on('data')
,以便通知异步函数已完成执行