AWS Lambda returns RDS 连接上的空响应 - NodeJS

AWS Lambda returns empty response on RDS connect - NodeJS

我有一个可公开访问的 AWS RDS,我想使用 AWS Lambda 连接到该 RDS。我正在使用 API 网关创建一个名为“/hello”的 Rest API,它需要 return RDS 连接状态。

Lambda代码如下。

var mysql = require('mysql');
var ApiBuilder = require('claudia-api-builder'),
  api = new ApiBuilder();

var con = mysql.createConnection({
  host: "host",
  user: "user",
  password: "password"
});

module.exports = api;

api.get('/hello', function () {

//any code written here, works perfectly, when this is called

  con.connect(function(err) { //this part doesn't work
    if (err) return err;
    return "connected";
  });
});

数据库可以公开访问,甚至可以从我的本地计算机访问。 Lambda 函数还具有 AWS RDS 所需的权限。

我在浏览器上得到的响应如下

{}

我查了云表日志,如下。

08:16:11
START RequestId: bf804be1-4797-11e8-8b3f-5b09118631a6 Version: $LATEST
08:16:11
END RequestId: bf804be1-4797-11e8-8b3f-5b09118631a6
08:16:11
REPORT RequestId: bf804be1-4797-11e8-8b3f-5b09118631a6  Duration: 34.28 ms  Billed Duration: 100 ms Memory Size: 128 MB Max Memory Used: 26 MB

Lambda 函数不会超过 con.connect(...),其中任何地方都没有显示错误(甚至在 RDS 日志上也没有)。 API 网关可以正常工作,因为 con.connect(...) 之前的任何代码都可以正常工作。这可能是什么问题?

con.connect(function(err) {
    if (err) return err;
    return "connected"; 
});

这是一个异步调用。在调用 connect 回调函数之前,lambda 将完成并退出。

将此更改为

con.connect(function(err) {
    if (err) context.done(err);
    context.done(null, "connected"); 
});

正如 @ConfusedCoder 所解释的,这是由于 con.connect(...) 是一个异步调用造成的。在 Lambda 中使用上下文在这里不是一个选项,因为 Lambda 是使用 API 网关调用的,并且场景中没有使用 exports.myhandler。因此context对象不能用来控制Lamda的流程。

exports.myHandler = function(event, context) {
   ...
} 

我尝试使用 promises、async await 和其他技术,直到找到一个名为 sync-mysql 的节点包。这会对 mysql 数据库进行同步查询,AWS Lambda 在不执行数据库调用的情况下不会继续。下面给出更新后的代码,使用“sync-mysql”。

var ApiBuilder = require('claudia-api-builder'), api = new ApiBuilder();    
var MySql = require('sync-mysql');

var connection = new MySql({
  host: "host",
  user: "user",
  password: "password"
});

module.exports = api;

api.get('/hello', function(request) {    
  return connection.query('SELECT * FROM DB.DummyTable');    
});