AWS Lambda在RDS connect - NodeJS上返回空响应

时间:2018-04-24 08:48:03

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

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

2 个答案:

答案 0 :(得分:1)

<?PHP
error_reporting(-1);
error_reporting(E_ALL);
ini_set('display_errors',1);

$sender = 'info@mydomain.com';
$recipient = 'abc@gmail.com';

$subject = "php mail test";
$message = "php test message";
$headers = 'From:' . $sender;
$headers = "MIME-Version: 1.0"."\r\n";
if (mail($recipient, $subject, $message, $headers))
{
    echo "Message accepted";
}
else
{
    echo "Error: Message not accepted";
}
?>

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

将此更改为

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

答案 1 :(得分:0)

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

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

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