我开始使用AWS Lambda,并且尝试从处理程序功能请求外部服务。根据,HTTP请求应该可以正常工作,而且我还没有找到其他说明的文档。(实际上,人们已经发布了使用TwilioAPI发送SMS的代码。)
我的处理程序代码是:
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调用是这样的:
inputfile.txt
invoke-async
{ "url":"http://www.google.com" }
似乎处理程序代码中执行请求的部分被完全跳过了。我从请求库开始,然后回到使用Plain http创建一个最小示例。我还尝试请求我控制的服务的URL以检查日志,并且没有任何请求进入。
http
我完全迷住了。 节点和/或AWS Lambda不会执行HTTP请求有什么原因吗?
当然,我误会了这个问题。正如AWS自己所说的那样:
对于那些在Lambda中首次遇到nodejs的人来说,一个常见的错误是忘记了回调是异步执行的,而context.done()当您确实要等待另一个回调(例如S3.PUT操作)完成时,则调用 原始处理程序,从而强制执行该函数因工作不完整而终止。
context.done()
context.done在请求的任何回调被触发之前,我正在调用way,导致我的函数提前终止。
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默认情况下返回。
succeed
done
fail
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中找到