【问题标题】:NodeJS mysql connection.query callback not logging results to console?NodeJS mysql connection.query回调没有将结果记录到控制台?
【发布时间】:2021-10-04 17:33:06
【问题描述】:

尝试使用 mySQL npm 包连接到数据库并打印查询结果。 为什么 con.connect() 和 con.query() 中的 console.log() 语句不打印“已连接!”还是查询到控制台的结果?

console.log("we here now") 被执行并且程序没有退出。 如果我提供了错误的密码/主机,con.connect() 中的错误确实会被抛出,但是当连接建立时,“已连接!”不打印。 我错过了什么?

var mysql = require('mysql');

var con = mysql.createConnection({
    host: 'host',
    port: 'port',
    user: 'user',
    password: 'pass'
});


con.connect(function(err) {
    if (err) throw err;
    console.log("connected!");
    con.query("SELECT 1 as solution", function (err, result, fields) {
        if (err) throw err;
        console.log(result);
    });
});

console.log("we here now");

con.end();

【问题讨论】:

  • 提及端口号 3306
  • 我刚刚从这段代码中删除了正确的主机/端口。我在运行脚本时提供了正确的参数。

标签: javascript mysql node.js


【解决方案1】:

在 server.js 文件中使用以下代码

var mysql = require('mysql');
const util = require('util');

        const mysqlconnection = mysql.createConnection({
            host: '10.0.1.117', //Change this IP
            user: 'john',
            password: 'password',
            database: 'customers_db',
            port: 3306,
            multipleStatements: true,
        });
          
      

const db1 = mysqlconnection;
const query = util.promisify(db1.query).bind(db1);


async function connectMySql(callback) {
    mysqlconnection.connect(async function (err, client) {
        if (err) {
            console.error('error connecting: ' + err);
            return;
        }
        let myquery1 = "SELECT * FROM users";
        var newRecords = [];
        newRecords = await query(myquery1)
            .catch(err => {
                console.log(err)
            });
        console.log(newRecords)
    });
};

connectMySql();

这给出了输出

> [ RowDataPacket {
>     UserId: 101212,
>     LoginName: 'user1233',
>     RoleName: user',
>     C7: '2021-07-28 11:29:28' } ]

【讨论】:

  • 检查更新的答案。这适用于 server.js 文件
【解决方案2】:

有几件事。

首先,进行轻微的重构。将 connection.query 移动到与 connect 调用相同的范围内。

当然要确保你设置了连接配置:

const mysql      = require('mysql');
const connection = mysql.createConnection({
  host     : 'BE_SURE_TO_SET_ME',
  user     : 'BE_SURE_TO_SET_ME',
  password : 'BE_SURE_TO_SET_ME',
  database : 'BE_SURE_TO_SET_ME'
});

connection.connect(function(error){
  if (error) {
    console.error('❌ Query failed: ', error);
    throw error;
  }
  console.log('✅ Connection successful');
});

connection.query('SELECT 1 + 1 AS solution', function (error, results, fields) {
  if (error) {
    console.error('❌ Query failed: ', error);
    throw error;
  }
  console.log('✅ Query successful. Results: ', {results});
});

connection.end();

其次,JS 本质上是异步的,所以console.log("we here now"); 触发的原因是因为它与connect 在同一范围内。 JS 引擎不会等到调用 connect 回调,它只是移动到下一条语句。所以有一个竞争条件 - 它可能(或可能不)在连接函数回调引发错误之前的进程滴答声中执行。

因此,我在它们发生的回调中添加了console.logconsole.error 语句。这会给你更好的反馈。 (ps.最好使用像winston这样的记录器)

【讨论】:

  • 我试过这个和console.log('连接成功');和console.log('查询成功。结果:', {results});不要被执行。但是,在 connection.query() 之后和 connection.end() 之前的 console.log() 确实会被调用。为什么?
  • 您能否将打印出来的内容发布到您的控制台(包括错误)
【解决方案3】:

1-这4个变量你改正了吗

主机:'主机', 端口:'端口', 用户:'用户', 密码:“通过”

2- 确保您的 mysql 数据库服务器正在运行

3- 验证您的 SQL SELECT 查询,什么是 1 以及来自哪个表? 并确保数据库不为空。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2019-08-16
    • 2021-02-20
    • 1970-01-01
    • 2015-07-26
    • 2020-12-26
    • 1970-01-01
    • 2016-04-16
    • 1970-01-01
    相关资源
    最近更新 更多