Node.js 如何在Lambda/API网关中使用参数传递
我正在尝试使用API网关、Lambda和RDS构建一个API。因此,您可以键入URL并以JSON格式从RDS获取特定的行 这就是我想要实现的目标。Node.js 如何在Lambda/API网关中使用参数传递,node.js,amazon-web-services,aws-lambda,aws-api-gateway,Node.js,Amazon Web Services,Aws Lambda,Aws Api Gateway,我正在尝试使用API网关、Lambda和RDS构建一个API。因此,您可以键入URL并以JSON格式从RDS获取特定的行 这就是我想要实现的目标。 /生产/myfootballapi?表=足球->表中的所有行 应返回(不工作) /生产/myfootballapi?表=足球&id=2->仅id 2行 应返回(仅此案例有效) 我遇到的主要问题是,我目前无法显示所有行,因为我必须始终定义id,否则会发生错误 我的API网关主体映射模板: { "table" : "$input.params('ta
- /生产/myfootballapi?表=足球->表中的所有行 应返回(不工作)
- /生产/myfootballapi?表=足球&id=2->仅id 2行 应返回(仅此案例有效)
{
"table" : "$input.params('table')",
"id" : $input.params('id')
}
我的Lambda函数
var mysql = require('mysql2');
var config = require('./config.json');
var pool = mysql.createPool({
host : config.dbhost,
user : config.dbuser,
password : config.dbpassword,
database : config.dbname,
});
exports.handler = (event, context, callback) => {
//prevent timeout from waiting event loop
context.callbackWaitsForEmptyEventLoop = false;
pool.getConnection(function(err, connection) {
if (err) throw err;
// Use the connection
var table = event.table;
var id = event.id;
// This if-function is just a try to solve this problem but it doesn't work
if (id !== null) {
var sql = "SELECT * FROM ?? WHERE id = ?";
var inserts = [table, id];
} else {
var sql = "SELECT * FROM ?";
var inserts = table;
}
sql = mysql.format(sql, inserts);
connection.query(sql, function (error, results, fields) {
// And done with the connection.
connection.release();
// Handle error after the release.
if (error) callback(error);
else callback(null,results);
});
});
};
如果您需要更多信息,请留下评论
谢谢 我相信您的问题可能是您的
if(id!==null)
语句。我模拟了您的示例,添加了console.log(sql)
发现,即使请求中没有发送id,返回的SQL查询也是SELECT*FROM'\“Customer\”,其中id=NULL
我将您的if声明更改为以下内容
if(id){
var sql=“SELECT*FROM??其中id=?”;
var inserts=[table,id];
}否则{
var sql=“选择*自?”;
变量插入=表;
}
我认为您的映射模板可能太简单了。如果你能做到这一点,我很想知道怎么做,因为我的模板需要大量的代码,做对很痛苦,但我接受了。我认为如果没有更多的处理,当某些值或参数被输入时,您可能会遇到其他问题。你必须处理逃跑等问题
这是我用来将API网关映射到lambda的模板。我从cloudformation模板中取出了它,所以如果仍然存在随机json或额外的引号,请原谅我。如果你想看看cloudformation模板,我可以展示一下
#set($allParams = $input.params()) {
\"params\" : {
#foreach($type in $allParams.keySet())
#set($params = $allParams.get($type))
\"$type\" : {
#foreach($paramName in $params.keySet())
\"$paramName\" :
\"$util.escapeJavaScript($params.get($paramName))\
if($foreach.hasNext),#end\
#end
}\
#if($foreach.hasNext),#end
#end\
}
}
首先,非常感谢大家对我的帮助。我自己修复了它,但如果有人有类似的问题,我也会记录下来
>API网关Lambda您应该将
if-else
语句更改为:
if (id !== "") {
var sql = "SELECT * FROM ?? WHERE id = ?";
var inserts = [table, id];
} else {
var sql = "SELECT * FROM ?";
var inserts = table;
}
由于您已经设置了主体映射模板,
id
将在您不将其作为参数传递时设置为“”
。您可以在日志中看到它的值,也可以在输入if else
语句之前尝试记录id
。我的2美分,我不确定:API网关主体映射模板需要两个参数:表和id
,或者在第一种情况下您只提供一个。如果不定义id,会发生什么错误?你能在它自己的部分发布吗?@UsmanMutawakil我收到一条“{”消息“:“无法将请求正文解析为json:意外字符(\'}\'(代码125)):在[Source:[B@30328d38;第4行,第2列]“}”我将所有内容都更改为您的推荐和部署API。我收到一条“{”消息:“内部服务器错误”}今晚晚些时候回家时,我将查看我的代码。同时,请确保在Lambda的响应中返回有效的JSON对象。这很可能是一个错误的响应。我已更新了我的答案,以包括我在模拟测试中使用的格式。其他信息c这里可以找到一个例子:如果继续看到错误,您可能希望在API网关上启用日志记录,并通过CloudWatch进行查看。
var mysql = require('mysql2');
var config = require('./config.json');
var pool = mysql.createPool({
host : config.dbhost,
user : config.dbuser,
password : config.dbpassword,
database : config.dbname,
});
exports.handler = (event, context, callback) => {
//prevent timeout from waiting event loop
context.callbackWaitsForEmptyEventLoop = false;
pool.getConnection(function(err, connection) {
if (err) throw err;
// Use the connection
var table = event.table;
var id = event.id;
if (isNaN(id)) {
var sql = "SELECT * FROM ??";
var inserts = table;
} else {
var sql = "SELECT * FROM ?? WHERE id = ?";
var inserts = [table, id];
}
sql = mysql.format(sql, inserts);
connection.query(sql, function (error, results, fields) {
// And done with the connection.
connection.release();
// Handle error after the release.
if (error) callback(error);
else callback(null,results);
});
});
};
if (id !== "") {
var sql = "SELECT * FROM ?? WHERE id = ?";
var inserts = [table, id];
} else {
var sql = "SELECT * FROM ?";
var inserts = table;
}