gpt4 book ai didi

mysql - Nodejs 12 回调不适用于 mysql 连接?

转载 作者:行者123 更新时间:2023-11-29 06:25:48 25 4
gpt4 key购买 nike

我正在编写此代码以在 AWS Lambda 中运行。

查看 mysql连接文档

我希望,如果一切正常,没有错误,会收到消息“数据库连接成功!”然后获取一条消息“connected as id”,但这不是它发生的顺序。这是我的代码。

'use strict';

let mysql = require('mysql');

const connection = mysql.createConnection({
dateStrings: true,
host : process.env.rds_host,
user : process.env.rds_user,
password : process.env.rds_password,
database : process.env.rds_database,
port : process.env.rds_port
});

exports.handler = (event, context, callback) => {
//prevent timeout from waiting event loop
context.callbackWaitsForEmptyEventLoop = false;

let sql = 'SELECT * FROM company ORDER BY points DESC, name ASC';
let data = null;
console.log('\nGetCompanies SQL: ', sql);
let responseBody = "";
let statusCode = 0;

connection.connect(function(err) {
if (err) {
statusCode = 500;
responseBody = err;
}
else{
console.log("Database connected successfully!");
statusCode = 200;
responseBody = "Database connected successfully!";
}
});
console.log('connected as id ' + connection.threadId);

connection.query(sql, data, function(queryError, results) {
if(queryError) {
console.error(queryError.message);
callback(queryError);
}
else
{
console.log('\nGetCompanies Results: ', results[0]);
callback(null, results);
}
});
};

这是记录的输出:

信息
GetCompanies SQL:SELECT * FROM company ORDER BY 点 DESC,名称 ASC 2020-01-01T11:52:57.813Z

信息连接为 id null 2020-01-01T11:52:57。952Z

信息数据库连接成功!2020-01-01T11:52:57。974Z

我的想法是我提供的功能:

connection.connect(function(err) {

将在connection.connect之后的任何代码之前执行。我这样想有错吗?

还有一个问题:为什么

connected as id null? I got that code (connection.threadId) straight from the mysql docs.

我知道这没什么大不了的,如果它影响的只是日志消息的顺序,但我有其他功能,我无法进行查询,因为连接还不存在。

当它吹过时,这很令人困惑

if (err) {
statusCode = 500;
responseBody = err;
}
else{
<do some connection.query code here>
}

我将这些日志消息放在这里是因为此方法有效,而我的其他方法无效。

最佳答案

您之所以出现这种行为,是因为 console.log('connected as id ' + connection.threadId); 没有等待 connection.connect 完成连接。

您需要使用promises在这里。

您可以尝试使用async/await

exports.handler = async (event, context, callback) => {
//prevent timeout from waiting event loop
context.callbackWaitsForEmptyEventLoop = false;

let sql = 'SELECT * FROM company ORDER BY points DESC, name ASC';
let data = null;
console.log('\nGetCompanies SQL: ', sql);
let responseBody = "";
let statusCode = 0;

try {
await connection.connect();

console.log("Database connected successfully!");
console.log('connected as id ' + connection.threadId);

const queryResult = await connection.query(sql, data);

// do something with queryResult
} catch (e) {
// handle error
}
};

编辑

您链接到的资源建议使用 promise 而不是回调:

await any promise instead of using callbacks

关于mysql - Nodejs 12 回调不适用于 mysql 连接?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59552875/

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