Node.js 如何在Lambda/API网关中使用参数传递

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

我正在尝试使用API网关、Lambda和RDS构建一个API。因此,您可以键入URL并以JSON格式从RDS获取特定的行

这就是我想要实现的目标。

  • /生产/myfootballapi?表=足球->表中的所有行 应返回(不工作)
  • /生产/myfootballapi?表=足球&id=2->仅id 2行 应返回(仅此案例有效)
我遇到的主要问题是,我目前无法显示所有行,因为我必须始终定义id,否则会发生错误

我的API网关主体映射模板:

{
"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;
}