[英]Fetch Http Response NodeJS
嘗試在其中發出http請求的NodeJS(nodeJs的新手)中執行AWS Lambda。 Lambda執行結束時,我希望返回http請求的響應代碼和響應消息。
撥打http請求:
var executeRequest = function(request, callback) {
const req = https.request(request, (res) => {
console.log('statusCode:', res.statusCode);
console.log('headers:', res.headers);
res.on('data', (d) => {
process.stdout.write(d);
});
callback(res);
});
req.on('error', (e) => {
console.error(e);
});
req.end(request.body);
};
Lambda代碼:
exports.handler = (event, context, callback) => {
// Formulate request
var result = executeRequest(request, function(response) {
console.log("Response Code: ", response.statusCode);
console.log("Response Message: ", response.statusMessage);
// Successfully able to print the response above
return response;
});
console.log("Result Response Code: ", result);
console.log("Result Response Message: ", result);
}
我希望從Lambda返回response.statusCode和response.statusMessage作為響應
return{
statusCode: <the code>,
body: <the message>,
};
但是,結果填充為未定義。 如何提取所需的響應參數,以便可以正確返回它們?
**編輯:**建議更改后的代碼段:使用Promise進行編碼:
var executeRequest = function(request, callback) {
return new Promise((resolve, reject) => {
https.request(request, function(res) {
if(res.statusCode==200 || res.statusCode==404) {
resolve(res);
}
else {
console.error(res);
reject(res.statusCode);
}
}).end(request.body || '');
});
};
exports.handler = (event, context, callback) => {
// Formulate request
var value = executeRequest(request).then(function(result) {
console.log("Result ", result);
const response = { statusCode: 200, body: JSON.stringify('Hello from Lambda!') };
return response;
});
console.log(value);
}
問題是您的executeRequest
是異步的,而您的lambda對此一無所知,因此它將立即返回。
代替返回響應,將其作為第二個參數傳遞給callback
(第一個是錯誤對象)
callback(null, response)
這部分將被執行,而無需等待executeRequest
響應,其余代碼將被執行
var result = executeRequest(request, function(response) {
console.log("Response Code: ", response.statusCode);
console.log("Response Message: ", response.statusMessage);
// Successfully able to print the response above
return response;
});
所以在這一點上
console.log("Result Response Code: ", result);
console.log("Result Response Message: ", result);
result
仍然為空。
因此,您應該改做這樣的事情。
var result = executeRequest(request, function(response) {
console.log("Response Code: ", response.statusCode);
console.log("Response Message: ", response.statusMessage);
// Successfully able to print the response above
callback(null, response);
});
嘗試這樣的事情。
exports.handler = function( event, context, callback ) {
//this is to allow function to return as soon as result is shown
context.callbackWaitsForEmptyEventLoop = false;
var request = ...//I expect request is a predefined value or define the request here.
executeRequest(request).then( function( result ) {
//keep all console log before return.
console.log("Result ", result);
const response = { statusCode: 200, body: JSON.stringify('Hello from Lambda!') };
callback(null, response);
return;
});
}
function executeRequest(request){
return new Promise( ( resolve, reject ) => {
https.request(request, function(res) {
if(res.statusCode==200 || res.statusCode==404) {
resolve(res);
}else {
console.error(res);
reject(res.statusCode);
return;
}
}).end(request.body || '');
});
}
將您的Lambda代碼更改為以下代碼,
exports.handler = (event, context, callback) => {
// Formulate request
var result = executeRequest(request, function(response) {
console.log("Response Code: ", response.statusCode);
console.log("Response Message: ", response.statusMessage);
// Successfully able to print the response above
callback(null, response);
});
}
希望能幫助到你。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.