作者:张宏顺Lingling | 来源:互联网 | 2023-05-22 15:05
我开始使用AWS Lambda,我正在尝试从我的处理程序函数请求外部服务.根据这个答案,HTTP请求应该可以正常工作,我没有找到任何其他说明的文档.(事实上,人们已经发布了使用Twilio API发送短信的代码.)
我的处理程序代码是:
var http = require('http');
exports.handler = function(event, context) {
console.log('start request to ' + event.url)
http.get(event.url, function(res) {
console.log("Got response: " + res.statusCode);
}).on('error', function(e) {
console.log("Got error: " + e.message);
});
console.log('end request to ' + event.url)
context.done(null);
}
我在CloudWatch日志中看到以下4行:
2015-02-11 07:38:06 UTC START RequestId: eb19c89d-b1c0-11e4-bceb-d310b88d37e2
2015-02-11 07:38:06 UTC eb19c89d-b1c0-11e4-bceb-d310b88d37e2 start request to http://www.google.com
2015-02-11 07:38:06 UTC eb19c89d-b1c0-11e4-bceb-d310b88d37e2 end request to http://www.google.com
2015-02-11 07:38:06 UTC END RequestId: eb19c89d-b1c0-11e4-bceb-d310b88d37e2
我期待那里有另一条线:
2015-02-11 07:38:06 UTC eb19c89d-b1c0-11e4-bceb-d310b88d37e2 Got response: 302
但那是缺失的.如果我在本地计算机上的节点中使用了没有处理程序包装器的基本部分,则代码按预期工作.
在inputfile.txt
我使用的是用于invoke-async
调用是这样的:
{
"url":"http://www.google.com"
}
看起来处理程序代码中执行请求的部分完全被跳过.我从请求lib开始,然后回到使用plain http
来创建一个最小的例子.我还试图请求我控制的服务的URL来检查日志,并且没有请求进入.
我完全难过了.是否有任何理由Node和/或AWS Lambda不会执行HTTP请求?
1> awendt..:
当然,我误解了这个问题.正如AWS自己所说:
对于那些在Lambda中第一次遇到nodejs的人来说,一个常见的错误就是忘记了context.done()
当你真正想要等待另一个回调(例如S3.PUT操作)来完成时,异步执行回调并调用
原始处理程序,强制执行该函数终止其工作不完整.
我在发出context.done
请求的任何回调之前调用方式,导致我的函数提前终止.
工作代码是这样的:
var http = require('http');
exports.handler = function(event, context) {
console.log('start request to ' + event.url)
http.get(event.url, function(res) {
console.log("Got response: " + res.statusCode);
context.succeed();
}).on('error', function(e) {
console.log("Got error: " + e.message);
context.done(null, 'FAILURE');
});
console.log('end request to ' + event.url);
}
更新:从2017年开始AWS已弃用旧的Nodejs 0.10,现在只有较新的4.3运行时可用(旧功能应该更新).此运行时引入了对处理函数的一些更改.新的处理程序现在有3个参数.
function(event, context, callback)
虽然你仍然会发现succeed
,done
和fail
上下文参数,AWS建议使用的callback
功能,而不是或null
默认情况下返回.
callback(new Error('failure')) // to return error
callback(null, 'success msg') // to return ok
有关完整文档,请访问http://docs.aws.amazon.com/lambda/latest/dg/nodejs-prog-model-handler.html
那么,你如何使你的处理程序代码工作?我的理解是你需要删除context.done()以便调用回调函数.但是你的代码仍然不适合我.:(
需要将`context.done()`调用移入回调(成功和错误情况).
还没有你的问题,但是当我向前推进lambda时要记住这一点.
用2017年更新更新2015年问题的道具!
2> imTachu..:
是的,awendt答案是完美的.我只是展示我的工作代码......我有了context.succeed('Blah'); 在reqPost.end()之后的行; 线.将它移动到我在下面显示的地方解决了一切.
console.log('GW1');
var https = require('https');
exports.handler = function(event, context) {
var body='';
var jsOnObject= JSON.stringify(event);
// the post options
var optiOnspost= {
host: 'the_host',
path: '/the_path',
method: 'POST',
headers: {
'Content-Type': 'application/json',
}
};
var reqPost = https.request(optionspost, function(res) {
console.log("statusCode: ", res.statusCode);
res.on('data', function (chunk) {
body += chunk;
});
context.succeed('Blah');
});
reqPost.write(jsonObject);
reqPost.end();
};
3> 小智..:
使用节点的Http请求的简单工作示例。
const http = require('https')
exports.handler = async (event) => {
return httprequest().then((data) => {
const respOnse= {
statusCode: 200,
body: JSON.stringify(data),
};
return response;
});
};
function httprequest() {
return new Promise((resolve, reject) => {
const optiOns= {
host: 'jsonplaceholder.typicode.com',
path: '/todos',
port: 443,
method: 'GET'
};
const req = http.request(options, (res) => {
if (res.statusCode <200 || res.statusCode >= 300) {
return reject(new Error('statusCode=' + res.statusCode));
}
var body = [];
res.on('data', function(chunk) {
body.push(chunk);
});
res.on('end', function() {
try {
body = JSON.parse(Buffer.concat(body).toString());
} catch(e) {
reject(e);
}
resolve(body);
});
});
req.on('error', (e) => {
reject(e.message);
});
// send the request
req.end();
});
}