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

标签 mysql node.js aws-lambda

我正在编写此代码以在 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/

相关文章:

php - 从php :timed out error中的特定ip连接AWS RDS(mysql)

mysql - jsp字符串文字错误

node.js - npm peerDependency - 无法安装包

Php mysql插入同一表id的数组键值

c# - MySQL异常-读取数据时遇到 fatal error

node.js - OAuth2服务器: invalid or missing grant_type parameter

node.js - setTimeout安排的Node.js光纤和代码会导致崩溃

java - 用于 Java AWS Lambda 的 POJO 输入处理程序的大写字段

python-3.x - 在 AWS lambda 中使用/tmp 目录有多安全?

amazon-web-services - AWS Lambda 上的 .NET Core Web Api 在第一次请求时速度很慢