【发布时间】: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("..", () => {})都在同一个嵌套级别上。即,执行CREATE TABLE查询不会发生在CREATE DATABASE的回调内部,而是在其外部。因此,这段代码在执行下一个con.query(...)之前不会等待回调执行。虽然所有con.query()都嵌套在con.connect()的回调中......格式非常好,完全适合嵌套级别。
标签: mysql node.js database fatal-error