【问题标题】:AWS Lambda returns empty response on RDS connect - NodeJSAWS Lambda 在 RDS 连接上返回空响应 - NodeJS
【发布时间】:2018-10-04 10:50:35
【问题描述】:

我有一个可公开访问的 AWS RDS,我想使用 AWS Lambda 连接到该 RDS。我正在使用 API Gateway 创建一个名为“/hello”的 Rest API,它需要返回 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(...) 之前的任何代码都可以正常工作。这可能是什么问题?

【问题讨论】:

    标签: node.js amazon-web-services aws-lambda rds


    【解决方案1】:
    con.connect(function(err) {
        if (err) return err;
        return "connected"; 
    });
    

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

    把这个改成

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

    【讨论】:

    • 请查看markdown guide 并将代码示例格式化为代码,而不是块引用。
    • @ConfusedCoder 感谢您的回答。正如您所提到的,这是一个异步调用,Lambda 在它之前终止。使整个流程同步,解决了这个问题。
    • @ConfusedCoder 在 API Builder 方面没有上下文。有没有办法实现这一点?
    【解决方案2】:

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

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

    我尝试使用 Promise、异步等待和其他技术,直到找到一个名为 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');    
    });
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2019-05-27
      • 2018-11-16
      • 2017-07-25
      • 2017-12-27
      • 1970-01-01
      • 1970-01-01
      • 2021-03-17
      • 2020-03-16
      相关资源
      最近更新 更多