Nodejs node mysql 调用 query是异步方法吗

Nodejs node mysql 调用 query是异步方法吗

var x = undefined; db.query(xx, function(e, r, f){ x = r; console.log(‘1’ + x);}); console.log(‘2’ + x);


先打印了2, 再打印了1

8 回复

当然可以。以下是针对“Nodejs node mysql 调用 query是异步方法吗”这个问题的详细解答:


Node.js 中 node-mysql 模块的 query 方法是异步方法吗?

问题背景: 在使用 node-mysql 模块与 MySQL 数据库进行交互时,我们经常需要调用 query 方法来执行 SQL 查询。有时,可能会疑惑 query 方法是否是异步的,以及它如何影响程序的执行顺序。

示例代码:

const mysql = require('mysql');

// 创建一个数据库连接池
const db = mysql.createPool({
    host: 'localhost',
    user: 'root',
    password: 'password',
    database: 'test_db'
});

let x = undefined;

// 执行查询操作
db.query('SELECT * FROM users', (err, results) => {
    if (err) throw err;
    x = results;
    console.log('1' + JSON.stringify(x));
});

console.log('2' + JSON.stringify(x));

输出结果:

2undefined
1[{"id":1,"name":"Alice"},{"id":2,"name":"Bob"}]

解释:

  1. 异步性: query 方法是一个典型的异步函数。当执行 db.query 时,Node.js 不会阻塞等待查询完成。而是立即继续执行后续的代码(如 console.log('2' + JSON.stringify(x));)。

  2. 回调函数: 当数据库查询完成后,会触发回调函数 (err, results) => { ... }。这个回调函数会在数据准备好之后被调用,并且 x 变量会被赋值为查询的结果。

  3. 执行顺序: 因此,由于 query 是异步的,所以在 query 执行之前,程序会继续执行下一行代码,导致 console.log('2' + JSON.stringify(x)); 先于查询结果的处理被执行。这就是为什么你看到先打印 “2undefined” 后打印 “1[…]” 的原因。

总结: node-mysql 模块中的 query 方法确实是异步的。为了确保在执行任何依赖于查询结果的操作之前,查询已经完成,你应该始终在回调函数中处理查询结果。这样可以避免因异步操作导致的数据访问错误或逻辑问题。


是异步的。

额, 那做分页岂不是要 db.query(xx, function(){ db.query(xx, function(){ }); }); 这么写了 -_-

使用EventEmitter封装更好 定义:

var EventEmitter = require('events').EventEmitter;
var util = require('util');

function MySQLQueue() { EventEmitter.call(this); this._db = /* 创建mysql连接实例 */; } util.inherits(MySQLQueue, EventEmitter);

MySQLQueue.prototype.getPage = function(page) { var self = this; this._db.query(page, function(er, list) { if (er) self.emit(‘error’, er); else self.emit(‘page’, list); }) return this; }

使用:

var mysql = new MySQLQueue();
mysql.on('page', function(list) {
  /* TODO */
})
mysql.on('error', function(er) {
  /* handle errors */
})

mysql.getPage(1).getPage(2);

必须经过的坎儿

同样,觉得这样很坑啊…

不异步,node作甚?楼上的那个建议楼主用Async的,你确定Async能帮到楼主么?

node-mysql 库中的 query 方法确实是异步的。在你的例子中,query 方法接受一个回调函数来处理查询结果。由于 JavaScript 是单线程且非阻塞的,因此在调用 query 方法后,代码会立即执行后续的 console.log('2' + x) 语句,而不是等待数据库查询完成。

下面是一个更清晰的例子来说明这一点:

const mysql = require('mysql');

// 创建数据库连接
const db = mysql.createConnection({
  host: 'localhost',
  user: 'yourusername',
  password: 'yourpassword',
  database: 'yourdatabase'
});

// 定义变量x
let x = undefined;

// 执行查询并提供回调函数处理结果
db.query('SELECT * FROM yourtable', (error, results, fields) => {
  if (error) throw error;
  x = results; // 将查询结果赋值给x
  console.log('1 ' + JSON.stringify(x)); // 打印查询结果
});

// 这行代码会在查询完成之前执行
console.log('2 ' + x); // 输出undefined,因为查询还未完成

// 关闭数据库连接
db.end();

在这个例子中,console.log('2' + x) 在查询完成之前会被执行,所以它会输出 2 undefined。当查询完成后,回调函数被触发,x 被赋值为查询结果,并且 console.log('1' + x) 会打印实际的结果。

回到顶部