gpt4 book ai didi

mysql - 为什么我的 AWS Lambda node.js mysql 查询没有返回?

转载 作者:太空宇宙 更新时间:2023-11-03 11:25:55 25 4
gpt4 key购买 nike

我正在尝试将一些外部数据写入一些本地表。我们将遍历一个数组,将每个数组元素中的大部分数据写入主表,将其余数据写入相关表,每次都替换所有数据。

我已将代码精简到最基本的部分以显示我遇到的问题。 DELETE 运行良好,但 INSERT 只运行一次,甚至没有返回。

我在 https://imgur.com/a/zA6Hz8g 有输出的屏幕截图.在其中,您可以看到 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);
});
});

};

最佳答案

就在几个月前AWS made Node.js v 8.10 lambda 中可用的运行时。
这意味着,您可以使用 async/awaitPromises
因此,我们可以将代码重新安排为如下所示:

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);
}
}

此外,您可以重写代码以使用原生 Promisesasync/await 函数。
当然,覆盖 try/catch block 上的逻辑,为简单起见,我跳过了它们。

关于mysql - 为什么我的 AWS Lambda node.js mysql 查询没有返回?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54429287/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com