我在Amazon Lambda中运行nodejs功能。它应该在HTTP get之后插入mysql DB。一切似乎都很好 - 查看cloudwatch日志,查询被正确解析,如果我将查询复制粘贴到mysql控制台,它就完全按照它应该做的。
本质:
var mysql = require('mysql')
var connection = createConnection({ connection details });
connection.connect();
var query = connection.query('Insert into AAA select * \
from BBB where BBB.a = ?;', [parameter],
function(err, result) {}
);
connection.end();
问题在于Lambda版本什么都不做。查询是可见且正确的,函数返回干净但实际上从未插入任何内容。我也有同样的更新查询问题,但所有的mysql选择工作和返回的东西,所以问题不是那样。当我在我的机器上运行它时插入也有效 - 当我将它推到lambda时,问题出现了。
我尝试添加一个单独的提交语句,但无法使其正常工作。我显然遗漏了一些东西但却无法弄清楚是什么。我是否需要更新交易块?
编辑:按照Mark B的要求。我想通过仅显示部分代码,我试图比我更聪明。整个逻辑是:
exports.handler = function(event, context, callback){
if ( event.A == -1 ){
exports.updateDB(event, function(res) {
context.succeed(res)
}
}
};
exports.updateDB = function(event, callback) {
var mysql = require('mysql')
var connection = createConnection({ connection details });
connection.connect();
var query = connection.query( 'update products set A=? where product_id = ?;',
[parameters],
function(err,result){ });
var query = connection.query( 'insert into other_table select * from products where product_id = ?;',
[parameters],
function(err,result){ });
connection.commit(function(err) {
if(err) {
connection.rollback(function() {
throw(err);
});
}
connection.end();
});
callback({"ok":"ok"})
};
根据这里给出的建议,我做了以下更改。我拿走了最后一个回调函数,并将回调放在了connection.queries:
中 var query = connection.query( 'insert into other_table select * from products where product_id = ?;',
[parameters],
function(err,result){
callback({"ok":"ok"})
});
它似乎有效。我现在猜测提交-part什么也没做,但它似乎也没有打破它。在这一点上可能很明显,我不是一个开发人员,甚至不太熟悉node.js所以我非常感谢我的帮助!
答案 0 :(得分:4)
请注意,查询函数是一个异步函数,这意味着在触发回调函数之前它将不可用。在示例代码中,连接在触发后立即关闭,早在执行回调之前。尝试更改代码,以便在回调函数中关闭连接,例如
var query = connection.query('Insert into AAA select * \
from BBB where BBB.a = ?;', [parameter],
function(err, result) {
// now it is ok to close the connection
connection.end();
if (err) {
// error handling
}
else {
// do something with the result
}
}
);
顺便说一下,由于您正在使用Lambda,因此同样适用于callback()
,context.succeed()
和context.fail()
function handlers。换句话说,您可能想在上面写有关错误和结果处理的注释的地方调用它们。