Nodejs + mysql 怎么解决数据的异步

Nodejs + mysql 怎么解决数据的异步

pool.getConnection(function(err, connection) { connection.query(‘SELECT * FROM aaa’, function(err, rows) { connection.query(‘SELECT * FROM b’, function(err, active) { res.render(‘index’,{‘active’ : active,‘nav’ : rows}); connection.release(); }); }); });

模板传送数据的时候 我想两个查询数据库单个写 不想这么嵌套,单个写以后 上一个查询的数据就变空了,请问大神们这个怎么解决 嵌套


4 回复

当然可以。在 Node.js 中使用 MySQL 时,处理异步操作是一个常见的挑战。为了解决这个问题,我们可以利用 async/await 语法来简化异步代码,并确保每个查询都在前一个查询完成后再执行。这样可以避免嵌套回调(即所谓的“回调地狱”)并使代码更加清晰易读。

示例代码

首先,我们需要安装必要的库:

npm install mysql2

然后,我们可以在 Node.js 项目中编写以下代码:

const mysql = require('mysql2/promise'); // 使用 promise 版本的 mysql2

// 创建数据库连接池
const pool = mysql.createPool({
    host: 'localhost',
    user: 'yourusername',
    password: 'yourpassword',
    database: 'yourdatabase',
    waitForConnections: true,
    connectionLimit: 10,
    queueLimit: 0
});

async function fetchData() {
    let [rows, fields] = await pool.query('SELECT * FROM aaa');
    let [active, fields] = await pool.query('SELECT * FROM b');

    return { active, nav: rows };
}

app.get('/index', async (req, res) => {
    try {
        const data = await fetchData();
        res.render('index', data);
    } catch (error) {
        console.error(error);
        res.status(500).send('Internal Server Error');
    }
});

解释

  1. 创建连接池

    • 使用 mysql.createPool 创建一个连接池,这样可以更有效地管理数据库连接。
  2. 定义异步函数

    • fetchData 函数使用 async/await 来执行两个独立的 SQL 查询。每个查询都会等待前一个查询完成后才开始执行。
    • await pool.query(...) 确保每个查询都在前一个查询完成后执行。
  3. 处理路由请求

    • 在 Express 路由处理器中,我们调用 fetchData 函数并等待其返回的数据。
    • 如果查询过程中发生错误,我们会捕获异常并返回 500 错误响应。

通过这种方式,我们可以避免嵌套回调,使代码更易于理解和维护。希望这能帮助你解决问题!


异步嵌套的话为了保证数据的完整性必须写在上层的回调中,如果不像这么做的话可以看看async或者q这两个模块,这两个模块是为了解决异步函数的顺序执行的问题,可以去Git上看看,然后npm下载包就可以了。

你可以使用Promise或者async/await来解决Node.js中MySQL查询的异步问题,这可以让你的代码更简洁、更易于理解。这里我将展示如何使用mysql2/promise库(基于mysql模块的一个改进版本)和async/await来实现你的需求。

首先安装mysql2/promise

npm install mysql2

然后你可以这样重写你的代码:

const mysql = require('mysql2/promise');

// 创建连接池
const pool = mysql.createPool({
  host: 'localhost',
  user: 'yourusername',
  database: 'yourdatabase',
  waitForConnections: true,
  connectionLimit: 10,
  queueLimit: 0
});

async function fetchData() {
  try {
    const [rows, fields] = await pool.query('SELECT * FROM aaa');
    const [active, fields] = await pool.query('SELECT * FROM b');
    
    res.render('index', { active, nav: rows });
  } catch (err) {
    console.error(err);
  } finally {
    // 确保释放连接
    await pool.end();
  }
}

fetchData();

这种方法通过使用async/await避免了回调地狱(callback hell),使得代码更加直观易读。每次查询都会等待前一个查询完成,因此不会出现数据为空的情况。同时,finally块确保了无论是否发生错误,连接池最终会被关闭,从而释放数据库资源。

回到顶部