【问题标题】:Why I face Fatal Error in mysql with nodejs?为什么我在使用 nodejs 的 mysql 中遇到致命错误?
【发布时间】:2022-01-08 19:43:55
【问题描述】:

我正在尝试在 nodejs 中使用 mysql 模块创建数据库,但是在创建表并插入一些数据后,当我尝试 SELECT 并返回结果时,我遇到了致命错误!

    D:\Programming\Farahani App\App>node mysql.js
    Error: Cannot enqueue Query after fatal error.
        at Protocol._validateEnqueue (D:\Programming\Farahani App\App\node_modules\mysql\lib\protocol\Protocol.js:212:16)
        at Protocol._enqueue (D:\Programming\Farahani App\App\node_modules\mysql\lib\protocol\Protocol.js:138:13)
        at Connection.query (D:\Programming\Farahani App\App\node_modules\mysql\lib\Connection.js:198:25)
        at Handshake.<anonymous> (D:\Programming\Farahani App\App\mysql.js:28:13)
        at Handshake.<anonymous> (D:\Programming\Farahani App\App\node_modules\mysql\lib\Connection.js:526:10)
        at Handshake._callback (D:\Programming\Farahani App\App\node_modules\mysql\lib\Connection.js:488:16)
        at Handshake.Sequence.end (D:\Programming\Farahani App\App\node_modules\mysql\lib\protocol\sequences\Sequence.js:83:24)
        at Protocol.handleNetworkError (D:\Programming\Farahani App\App\node_modules\mysql\lib\protocol\Protocol.js:369:14)
        at Connection._handleNetworkError (D:\Programming\Farahani App\App\node_modules\mysql\lib\Connection.js:418:18)
        at Socket.emit (node:events:390:28) {
      code: 'PROTOCOL_ENQUEUE_AFTER_FATAL_ERROR',
      fatal: false
    }
    undefined

[如果相关,mysql 正在我的 xampp 中运行...]

感谢您的帮助。

我的代码:

const mysql = require('mysql');

const data = {
    host: "localhost",
    user: "user",
    password: "password",
    database: "mydb"
}
const con = mysql.createConnection(data)

    con.connect(() => {


        // create database 
        con.query('CREATE DATABASE mydb', () => {

        })
        // create table
        const table = "CREATE TABLE customers (name VARCHAR(255), address VARCHAR(255))";
        con.query(table, () => {
            })
        // add val to table
        const val1 = "INSERT INTO customers (name, address) VALUES ('Company Inc', 'Highway 37')";
        con.query(val1, () => {

        })
        // log results
        con.query("SELECT * FROM customers",  (err,result)=>{
            if(err) {console.log(err)};
            console.log(result);
        })
        con.end();
    })

【问题讨论】:

  • 因为con.query 是异步的,但您不是在等待查询结果,而是在并行执行多个查询。特别是,在创建 customers 表之前,您无需等待创建数据库。在插入和读取表格之前,您不会等待创建表格。
  • 可能,在创建新数据库后,您需要更新与该数据库的连接范围。
  • derpirscher,OP 正在使用回调链来处理异步。格式有点偏,所以很难看。 ali-babaee,您可能希望将代码转换为使用 Promise 和 async / await 以使事情更容易理解。
  • @kevintechie 是的,他正在使用回调。但是,所有的con.query("..", () =&gt; {}) 都在同一个嵌套级别上。即,执行CREATE TABLE 查询不会发生在CREATE DATABASE 的回调内部,而是在其外部。因此,这段代码在执行下一个con.query(...) 之前不会等待回调执行。虽然所有con.query() 都嵌套在con.connect() 的回调中......格式非常好,完全适合嵌套级别。

标签: mysql node.js database fatal-error


【解决方案1】:

您的代码有两个问题。主要问题是你不能在 mysql 中为每个连接执行多个查询。

您可以使用connection pools 使其更易于管理。

其次,您应该检查回调中的错误。这将有助于调试并使您的代码更加健壮。

con.query("select * from my_table", (error, results, fields) => {
  if (error) throw error;
  console.log(results);
});

【讨论】:

  • 感谢先生您的积分。问题是我不知道在 con.query() 中在哪里使用 await,因为除了 consol.log(err) 之外我没有看到任何回调。在使用池连接后,我面临 ACCESS_DENIED_ERROR。
  • 我不允许将我的代码作为评论分享,所以如果您可以查看下面的内容,我会将其作为新答案......>>>
【解决方案2】:
const mysql = require('mysql');

const con  = mysql.createPool({
    host: "localhost",
    user: "user",
    password: "password",
    database: "mydb"
});

        // create database 
        con.query('CREATE DATABASE mydb', (err) => {
            if(err) {console.log(err)};
        })
        // create table
        const table = "CREATE TABLE customers (name VARCHAR(255), address VARCHAR(255))";
        con.query(table, (err) => {
            if(err) {console.log(err)};
            })
        // add val to table
        const val1 = "INSERT INTO customers (name, address) VALUES ('Company Inc', 'Highway 37')";
        con.query(val1, (err) => {
            if(err) {console.log(err)};
        })
        // log results
        con.query("SELECT * FROM customers",  (err,result)=>{
            if(err) {console.log(err)};
            console.log(result);
        })
    

【讨论】:

  • 如果你更新你的代码,你不应该创建一个答案,而是用新代码编辑你的问题(可能还有一些关于你改变的评论......)
  • 您应该使用问题下方的edit 按钮将问题更新放在问题本身中
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-10-15
  • 1970-01-01
  • 2014-10-13
  • 2021-08-17
相关资源
最近更新 更多