【发布时间】:2016-03-23 01:41:10
【问题描述】:
我希望有人可以帮助我获取从 Lambda 中的 AWS API Gateway 传递的 URL 参数。
我有点困惑如何在 Lambda 代码中访问它。
对于 API 网关,我遵循了以下步骤:
1) 转到资源 -> 集成请求
2) 点击模板下拉菜单旁边的加号图标
3) 在内容类型字段中显式键入 application/json
4) 对于输入映射 Entered:
{ "apiToken": "$input.params('apiToken')" }
为了澄清,我如何在我的 Lambda 函数中访问参数 apiToken?
我已经看了一段时间的演练和其他文档,我的大脑有点疲惫。
感谢所有帮助和反馈 :)
更新
所以,问题似乎是 AWS 网站 AJAX 保存没有保存我在映射中输入的内容(我在酒店 wifi 上,所以可能是这样)。
现在,当我测试它时,我得到:
Received event: { appToken: '123456' }
在 lambda 的控制台日志中。但是,当我去 API 网关,并 deploy 响应是:
"errorMessage": "进程在完成请求前退出"
有什么想法吗?
P.S 该函数在 Lambda 控制台中有效,但是,当我使用 Postman [POST + Param] 对其进行测试时,它不起作用,上面提供了错误消息
更新 2
这是我的整个 Lambda 函数
console.log('Loading event');
var AWS = require('aws-sdk');
var dynamodb = new AWS.DynamoDB({apiVersion: '2012-08-10'});
var http = require('http');
exports.handler = function(event, context) {
var tableName = "clients";
var appToken = event.params.appToken; //gr5f4sgnca25hki98
dynamodb.getItem({
TableName: tableName,
Key: {
ClientID: { S: appToken } }
}, function (err, data)
{
if (err) {
context.done(err);
} else {
var url = data.Item.url.S + data.Item.api.S;
console.log(url);
console.log('Received event:', event.params.appToken);
http.get(url, function(res) {
// Continuously update stream with data
var body = '';
res.on('data', function(d) {
body += d;
});
res.on('end', function() {
var result = body.replace('\\', '');
context.succeed(JSON.parse(result));
});
res.on('error', function(e) {
context.fail("Got error: " + e.message);
});
});
}
});
};
在我的测试活动中,我有:
{
"method": "POST",
"params": {
"appToken": "gr5f4sgnca25hki98"
}
}
当我在 Lambda 中运行它时,响应会起作用,它会连接到外部 JSON 文件并返回它。
但是,在 Postman 中我收到错误:
"errorMessage": "进程在完成请求前退出"
任何人都可以看到为什么在控制台中一切正常,而当我在部署中尝试它时仍然出现错误?
当我打开 XCODE 并使用 Alamofire 测试此网址时,我收到此错误(如果有帮助)
字符 72 周围的序列无效
更新 3(从 API 控制台测试)
从 API 控制台测试时,使用:
{
"method": "POST",
"params": {
"appToken": "gr5f4sgnca25hki98"
}
}
在请求正文中。我明白了:
请求:/sendtoclient
状态:200
延迟:1839 毫秒
响应正文
{ "errorMessage": "进程在完成请求前退出" }
响应标头
{"Content-Type":"application/json"}
日志
Execution log for request test-request
Tue Mar 22 17:28:27 UTC 2016 : Starting execution for request: test-invoke-request
Tue Mar 22 17:28:27 UTC 2016 : HTTP Method: POST, Resource Path: /sendtoclient
Tue Mar 22 17:28:27 UTC 2016 : Method request path: {}
Tue Mar 22 17:28:27 UTC 2016 : Method request query string: {}
Tue Mar 22 17:28:27 UTC 2016 : Method request headers: {}
Tue Mar 22 17:28:27 UTC 2016 : Method request body before transformations: {
"method": "POST",
"params": {
"appToken": "gr5f4sgnca25hki98"
}
}
Tue Mar 22 17:28:27 UTC 2016 : Endpoint request body after transformations: { "appToken": "" }
Tue Mar 22 17:28:29 UTC 2016 : Endpoint response body before transformations: {"errorMessage":"Process exited before completing request"}
Tue Mar 22 17:28:29 UTC 2016 : Endpoint response headers: {x-amzn-Remapped-Content-Length=0, x-amzn-RequestId=123456789, Connection=keep-alive, Content-Length=59, X-Amz-Function-Error=Unhandled, Date=Tue, 22 Mar 2016 17:28:29 GMT, Content-Type=application/json}
Tue Mar 22 17:28:29 UTC 2016 : Method response body after transformations: {"errorMessage":"Process exited before completing request"}
Tue Mar 22 17:28:29 UTC 2016 : Method response headers: {Content-Type=application/json}
Tue Mar 22 17:28:29 UTC 2016 : Successfully completed execution
Tue Mar 22 17:28:29 UTC 2016 : Method completed with status: 200
我不确定如何破译这个。任何帮助将不胜感激。但是我注意到了这一点:
Endpoint request body after transformations: { "appToken": "" }
出于某种原因,我觉得这可能很重要
【问题讨论】:
-
将此添加到您的 Lambda 函数中(在大多数示例中已经存在)
console.log('Received event:', JSON.stringify(event, null, 2));然后事件对象应该很好地打印在您的日志中,您将能够看到所有可用的属性供您在代码中访问。 -
这给了我输出:Received event: {} 当我测试 lambda 函数时
-
那你没有正确映射到 API Gateway。
-
我发布了绘制它的步骤。你能看出我做错了什么吗?
-
p.s 我在您的个人资料中看到您已获得 AWS 认证 - 感谢您帮助我,非常感谢。
标签: amazon-web-services lambda url-parameters aws-lambda