Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/mysql/58.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/node.js/34.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
为什么我的AWS Lambda node.js mysql查询没有返回?_Mysql_Node.js_Amazon Web Services_Lambda - Fatal编程技术网

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

为什么我的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已发送,但未返回任何内容。然后代码就失效了 这将导致成功写入第一行

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

我已经将代码剥离到最底层,以显示我遇到的问题。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_每个循环生成几个线程