为什么我的AWS Lambda node.js mysql查询没有返回?
我正在尝试将一些外部数据写入一些本地表。我们将遍历一个数组,将每个数组元素中的大部分数据写入主表,将其余数据写入相关表,每次替换所有数据 我已经将代码剥离到最底层,以显示我遇到的问题。DELETE运行正常,但INSERT只运行一次,甚至不返回 我有一个屏幕截图的输出在。 在其中,您可以看到DELETE的代码运行良好(ComQueryPacket已发送,OkPacket已返回),但当它到达INSERT时,ComQueryPacket已发送,但未返回任何内容。然后代码就失效了 这将导致成功写入第一行,但不会写入后续行 我尝试将连接更改为使用池,但也没有帮助 有什么想法吗为什么我的AWS Lambda node.js mysql查询没有返回?,mysql,node.js,amazon-web-services,lambda,Mysql,Node.js,Amazon Web Services,Lambda,我正在尝试将一些外部数据写入一些本地表。我们将遍历一个数组,将每个数组元素中的大部分数据写入主表,将其余数据写入相关表,每次替换所有数据 我已经将代码剥离到最底层,以显示我遇到的问题。DELETE运行正常,但INSERT只运行一次,甚至不返回 我有一个屏幕截图的输出在。 在其中,您可以看到DELETE的代码运行良好(ComQueryPacket已发送,OkPacket已返回),但当它到达INSERT时,ComQueryPacket已发送,但未返回任何内容。然后代码就失效了 这将导致成功写入第一行
var mysql = require('mysql');
var promise = require('promise');
const con = mysql.createConnection({
<connectionInfo>,
debug: true
});
function connectToDB() {
return new promise((resolve, reject) => {
console.log("IN connectToDB");
con.connect(function(err) {
if (err) {
console.log("ERROR: Could not connect -- " + err);
reject;
}
console.log("Connected!");
resolve();
});
});
}
function deleteExistingMainRow() {
return new promise((resolve, reject) => {
var query = "DELETE FROM my_table";
con.query(query, [],
function(err, result) {
if (err) {
console.log("ERROR in deleteExistingMainRow: " + err);
reject;
}
else {
console.log("DEBUG: Successful delete of main row");
resolve();
}
});
});
}
function writeMainRow(data_row) {
return new promise((resolve, reject) => {
console.log("IN writeMainRow");
var query = 'INSERT INTO my_table SET id = ?';
con.query(query, [data_row.id],
function(err, result) {
console.log("YES we tried to query");
if (err) {
console.log("ERROR in writeMainRow: " + err);
reject(err);
}
else {
console.log("DEBUG: Successful write of main row");
resolve();
}
});
});
}
exports.handler = function(event, context) {
connectToDB().then(function(script) {
deleteExistingMainRow().then(function(script) {
var data = [{ "id": 1 }, { "id": 2 }, { "id": 3 }];
data.forEach(data_row => {
writeMainRow(data_row).then(function(script) {
console.log("DEBUG: Main row written in forEach");
},
function(err) {
if (err) { console.log("ERR"); } process.exit(0);
}());
});
console.log("DEBUG: Hey we're exiting now");
con.commit;
con.end(function(err) {
console.log("Error on con end: " + err);
});
context.done(null, "DONE");
process.exit(0);
});
});
var mysql=require('mysql');
风险值承诺=要求(“承诺”);
const con=mysql.createConnection({
,
调试:正确
});
函数connectToDB(){
返回新承诺((解决、拒绝)=>{
console.log(“在connectToDB中”);
con.connect(功能(错误){
如果(错误){
log(“错误:无法连接--”+err);
拒绝
}
console.log(“已连接!”);
解决();
});
});
}
函数deleteExistingMainRow(){
返回新承诺((解决、拒绝)=>{
var query=“从我的表格中删除”;
con.query(query,[],
函数(错误、结果){
如果(错误){
log(“deleteExistingMainRow中的错误:“+err”);
拒绝
}
否则{
log(“调试:成功删除主行”);
解决();
}
});
});
}
函数writeMainRow(数据行){
返回新承诺((解决、拒绝)=>{
console.log(“IN writeMainRow”);
var query='插入我的_表集合id=?';
con.query(查询[data\u row.id],
函数(错误、结果){
log(“是的,我们试图查询”);
如果(错误){
log(“writeMainRow中的错误:+err”);
拒绝(错误);
}
否则{
log(“调试:成功写入主行”);
解决();
}
});
});
}
exports.handler=函数(事件、上下文){
connectToDB()。然后(函数(脚本){
deleteExistingMainRow()。然后(函数(脚本){
var data=[{“id”:1},{“id”:2},{“id”:3}];
data.forEach(数据行=>{
writeMainRow(数据行)。然后(函数(脚本){
log(“DEBUG:用forEach编写的主行”);
},
功能(err){
if(err){console.log(“err”);}process.exit(0);
}());
});
log(“调试:嘿,我们现在退出”);
犯罪;
con.end(功能(错误){
日志(“con端错误:+err”);
});
context.done(null,“done”);
进程退出(0);
});
});
}) 就在几个月前,lambda中提供了运行时。
也就是说,您可以使用
async/await
和Promises
这样,我们就可以将代码重新排列为如下内容:
exports.handler = async (event, context) => {
const dbConnection = await connectToDB();
await deleteExistingMainRow();
const data = [{ "id": 1 }, { "id": 2 }, { "id": 3 }];
// use here for...of loop to keep working with async/await behaviour
for(const data_row of data){
await writeMainRow(data_row);
}
}
此外,您还可以重写代码以使用本机承诺
或异步/等待
函数。当然,为了简单起见,我跳过了
try/catch
块中的逻辑。几个月前,lambda中提供了运行时。
也就是说,您可以使用
async/await
和Promises
这样,我们就可以将代码重新排列为如下内容:
exports.handler = async (event, context) => {
const dbConnection = await connectToDB();
await deleteExistingMainRow();
const data = [{ "id": 1 }, { "id": 2 }, { "id": 3 }];
// use here for...of loop to keep working with async/await behaviour
for(const data_row of data){
await writeMainRow(data_row);
}
}
此外,您还可以重写代码以使用本机承诺
或异步/等待
函数。当然,为了简单起见,我跳过了
try/catch
块中的逻辑
在表_中插入名称(id)值(?);
我知道你的查询和上面的查询是一样的。试试看
只需确保for循环正常工作,并将值发送到writeMainRow(函数)。如果传递空值并确保在for循环中没有传递相同的值,则不会显示错误。我认为您必须通过writeMainRow(data\u row.id)而不是writeMainRow(data\u row)
希望这有帮助。
另外一个建议是,如果要更新多行,mysql节点库中有一些选项,比如事务。使用这些函数将更有效,如果遇到错误,您可以回滚结果。另一种选择是编写过程,在这种情况下,mysql服务器将承担计算。尝试使用
在表_中插入名称(id)值(?);
我知道你的查询和上面的查询是一样的。试试看
只需确保for循环正常工作,并将值发送到writeMainRow(函数)。如果传递空值并确保在for循环中没有传递相同的值,则不会显示错误。我认为您必须通过writeMainRow(data\u row.id)而不是writeMainRow(data\u row)
希望这有帮助。
另外一个建议是,如果要更新多行,mysql节点库中有一些选项,比如事务。使用这些函数将更有效,如果遇到错误,您可以回滚结果。另一种选择是编写过程,在这种情况下,mysql服务器将承担计算。代码没有按预期运行的原因是NodeJ的异步特性 for_每个循环生成几个线程