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

安德鲁国王

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

我把这些日志消息放在这里是因为这种方法有效而我的另一种方法无效。

阿伦K
would execute before any code after connection.connect. Am I wrong to think that?
  • 您传递给 的connection.connect函数称为回调函数。这意味着,只有在成功连接(或连接尝试出错)后才会调用它。所以答案是否定的。connection.connect被调用,然后立即将调用的下一条语句。它不会等待当前语句,因为 javascript 是事件驱动且非阻塞的。

连接为 id null?我直接从 mysql 文档中获得了该代码 (connection.threadId)。

  • 这是因为前面的语句,您在获取连接之前记录了 connectionId。

使用回调

您的代码应如下所示。我没有做太多修改,只有在调用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] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章