- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我正在编写此代码以在 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/
我是一名优秀的程序员,十分优秀!