我正在编写此代码以在 AWS Lambda 中运行。
查看mysql连接文档
我希望,如果一切正常且没有错误,会收到消息“数据库连接成功!” 然后得到一条消息“作为 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);
}
});
};
这是记录的输出:
INFO
GetCompanies SQL: SELECT * FROM company ORDER BY points DESC, name ASC 2020-01-01T11:52:57.813Z
INFO连接为 id null 2020-01-01T11:52:57。952Z
INFO数据库连接成功!2020-01-01T11:52:57。974Z
我的想法是我提供给的功能:
connection.connect(function(err) {
将在 connection.connect 之后的任何代码之前执行。我这样想有错吗?
还有一个问题:为什么
连接为 id null?我直接从mysql文档中获得了该代码 (connection.threadId) 。
我知道这没什么大不了的,如果它只影响日志消息的顺序,但我还有其他功能,因为连接尚不存在,所以我无法进行查询。
当它吹过去时,这很令人困惑
if (err) {
statusCode = 500;
responseBody = err;
}
else{
<do some connection.query code here>
}
我把这些日志消息放在这里是因为这种方法有效而我的另一种方法无效。
would execute before any code after connection.connect. Am I wrong to think that?
connection.connect
函数称为回调函数。这意味着,只有在成功连接(或连接尝试出错)后才会调用它。所以答案是否定的。将connection.connect
被调用,然后立即将调用的下一条语句。它不会等待当前语句,因为 javascript 是事件驱动且非阻塞的。连接为 id null?我直接从 mysql 文档中获得了该代码 (connection.threadId)。
您的代码应如下所示。我没有做太多修改,只有在调用connect事件的回调之后才连接到数据库。
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) {
// we are inside the callback function a successful connection has been obtained , or error connecting to database
if (err) {
statusCode = 500;
responseBody = err;
}
else {
console.log("Database connected successfully!");
statusCode = 200;
responseBody = "Database connected successfully!";
}
// connection exists
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);
}
});
});
};
如果您可以使用 Promise 使您的代码可读和可理解。
import { promisify } from 'util';
exports.handler = async (event, context) => {
//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);
const connect = promisify(connection.connect);
const query = promisify(connection.query);
try {
const connection = await connect();
// connection exists
console.log('connected as id ' + connection.threadId);
const results= await query(sql);
return {
statusCode: 200,
responseBody: JSON.stringify(results)
}
} catch (err) {
return {
statusCode: 500,
responseBody: err.message
}
}
};
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句