Node.js Lambda中,https.request调用后callback应放何处返回响应数据?
我来帮你搞定这个问题,你遇到的核心问题有两个:一是Lambda的callback调用时机不对,二是callback的参数格式不符合规范,咱们一步步来修正:
首先理清楚为什么会出现这两个现象:
- 在response的end事件里调用callback报错:是因为你把响应内容直接传给了callback的第一个参数(Lambda的callback第一个参数是错误对象,第二个才是成功结果),同时你外部还提前调用了一次callback,导致Lambda提前终止了请求连接。
- 外部调用callback时dataStr为空:因为这时候https请求还没收到响应,dataStr还没被分块数据填充,自然是空的。
修正后的完整代码
const https = require('https'); // 别忘了引入https模块 getData: function (event, context, callback) { let inputData = event.body; let requestData = Object.assign({}, inputData); var dataRequest = 'field='+ requestData.Field1; var options = { method: 'POST', hostname: 'my.hostname.com', path: '/', headers: { "content-type": "application/x-www-form-urlencoded", "connection" : "keep-alive", "user-agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/66.0.3359.139 Safari/537.36", } }; var dataStr = ""; var req = https.request(options, function (response) { response.on('data', (chunk) => {dataStr += chunk;}); response.on('end', () => { console.log(response.statusCode + " " + dataStr); // 正确调用Lambda callback:第一个参数为null(无错误),第二个为响应内容 callback(null, dataStr); }); }); req.on('error', err => { // 错误时:第一个参数传错误信息,第二个参数为null callback("request error:" + err, null); }); req.write(dataRequest); req.end(); // 删掉这行!这会在请求还没完成时就结束Lambda,导致dataStr为空 // callback(null,dataStr); }
关键修正说明
移除提前调用的callback
最后一行的callback(null,dataStr)会在req.end()之后立即执行,此时https请求还在等待响应,dataStr根本没被填充,不仅返回空内容,还会让Lambda提前终止,导致后续响应处理被中断,甚至引发socket错误。修正callback参数格式
Lambda的callback(error, result)规范中,第一个参数是错误对象/信息(无错误时传null),第二个参数才是成功的返回结果。你之前直接传callback(dataStr),相当于把响应内容当成错误返回,不符合Lambda的执行逻辑,这也是引发异常的原因之一。确保callback在请求完成后调用
只有在response的end事件触发时,才说明所有分块数据都已接收完毕,这时候调用callback才能返回完整的dataStr,完全符合异步操作的执行逻辑。
内容的提问来源于stack exchange,提问作者CoderRoller
相关产品推荐
相关产品推荐

