我开始使用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
调用是这样的:
{
"url":"http://www.google.com"
}
似乎处理程序代码中执行请求的部分被完全跳过了。我从请求库开始,然后回到使用Plain
http
创建一个最小示例。我还尝试请求我控制的服务的URL以检查日志,并且没有任何请求进入。
我完全迷住了。 节点和/或AWS Lambda不会执行HTTP请求有什么原因吗?
当然,我误会了这个问题。正如AWS自己所说的那样:
对于那些在Lambda中首次遇到nodejs的人来说,一个常见的错误是忘记了回调是异步执行的,而
context.done()
当您确实要等待另一个回调(例如S3.PUT操作)完成时,则调用
原始处理程序,从而强制执行该函数因工作不完整而终止。
context.done
在请求的任何回调被触发之前,我正在调用way,导致我的函数提前终止。
工作代码是这样的:
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中找到
我到处都搜索了,但找不到答案,我怎么能发出HTTP请求?我尝试了几种可能性,但都不起作用。我总是出错。 02-27 17:52:58.611 13571-13571/com.example.app E/AndroidRuntime﹕ 致命异常:主java.lang.IllegalStateException:无法在android.view.view$1.onClick(view.java:3838
问题内容: 我有一个项目,我试图在回调中使用weakrefs,但我不明白我在做什么错。我创建了简化的测试,以显示我困惑的确切行为。 为什么在此测试中test_a可以正常工作,但是self.MyCallbackB的weakref在类初始化和调用test_b之间消失了?我以为只要实例(a)存在,对self.MyCallbackB的引用就应该存在,但是不存在。 问题答案: 您需要一个WeakMethod
为什么虽然它没有得到 http.status === 200 但它没有警报失败!
问题内容: 由于jQuery中的Ajax请求,存在未定义的错误。但是它在本地工作。jquery1.3.2.js @ 3633行中的错误引用 我的代码是: 代码中的警报向我显示(0,“未定义”); 我做错了什么? 问题答案: 如果您的ajax请求在完成之前被取消,则可能会发生这种情况。当用户通过刷新,单击链接或更改浏览器中的URL离开页面时,jQuery引发错误事件。通过为ajax调用实现错误处理程
问题内容: 在这段代码中,为什么不按我的意愿初始化我的数组?是不是for-each循环并非旨在做到这一点,或者我只是没有正确使用它? 问题答案: for-each循环不适用于这种情况。您不能使用for-each循环来初始化数组。您的代码: 将转换为以下内容: 如果这是一个对象数组,它仍然会失败。基本上,for-each依次将集合或数组中的每个条目分配给您提供的变量,然后可以使用该变量。该变量 不
问题内容: 我想在chromedp上使用代理,但是代理似乎不起作用,尝试了chromedp.ProxyServer 使用代理后,我得到了公共IPeven。无错误/警告 问题答案: 试试这个: