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');
});
我有一个可公开访问的 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');
});