Nodejs 新手求教:用mysql查询出数据之后,如何用变量保存这个数据数组,然后渲染到模板里?[已解决]

Nodejs 新手求教:用mysql查询出数据之后,如何用变量保存这个数据数组,然后渲染到模板里?[已解决]

var conn = require(‘mysql’).createConnection({ host : ‘localhost’, port : ‘3306’, user : ‘root’, password : ‘’, database : ‘user’ }); var data = []; //查询结果还没有覆盖这个变量之前,它就已经被输出了,结果还是空数组 conn.query(‘select * from njs_userdata’,function(err,res,fields){ if(err){throw err;} console.log(res); data = res; //这里的值怎么放到下面的data里?在外部声明一个变量是不行的,因为异步的原因 conn.end(); }); router.get(’/’, function(req, res) {//如果在这里查询数据库,然后在回调里使用res.render()会报错 res.render(‘index’, { title: ‘Express’, data:data //这里如何取到数据库查到的数组? }); });


3 回复

当然可以。在Node.js中处理异步操作时,我们需要确保在数据准备好后再进行渲染。以下是一个简单的示例,展示了如何从MySQL数据库查询数据,并将其传递给模板引擎(如EJS)进行渲染。

示例代码

首先,确保你已经安装了必要的依赖项:

npm install express mysql ejs

接下来,创建一个基本的Express应用,并实现数据库查询和模板渲染逻辑:

const express = require('express');
const mysql = require('mysql');
const app = express();

// 创建数据库连接
const conn = mysql.createConnection({
    host: 'localhost',
    port: '3306',
    user: 'root',
    password: '',
    database: 'user'
});

// 设置模板引擎为EJS
app.set('view engine', 'ejs');

// 定义路由
app.get('/', (req, res) => {
    // 执行数据库查询
    conn.query('SELECT * FROM njs_userdata', (err, results, fields) => {
        if (err) throw err;

        // 将查询结果传递给模板
        res.render('index', {
            title: 'Express',
            data: results
        });

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

// 启动服务器
app.listen(3000, () => {
    console.log('Server is running on http://localhost:3000');
});

解释

  1. 数据库连接

    • 使用mysql模块创建一个数据库连接对象。
    • 配置数据库连接参数(主机、端口、用户名、密码、数据库名)。
  2. 设置模板引擎

    • 使用app.set('view engine', 'ejs')设置模板引擎为EJS。
  3. 定义路由

    • /路径上定义一个GET请求处理器。
    • 在回调函数中执行数据库查询。
    • 如果查询成功,将结果传递给模板并渲染。
  4. 关闭数据库连接

    • 在渲染模板后立即关闭数据库连接。
  5. 启动服务器

    • 监听3000端口,启动服务器。

模板文件 views/index.ejs

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title><%= title %></title>
</head>
<body>
    <h1><%= title %></h1>
    <table>
        <% data.forEach(item => { %>
            <tr>
                <% for (let key in item) { %>
                    <td><%= item[key] %></td>
                <% } %>
            </tr>
        <% }); %>
    </table>
</body>
</html>

总结

通过这种方式,你可以确保在数据库查询完成后才渲染模板,并且可以在模板中正确地显示查询结果。关键在于理解异步操作的特性,并在适当的时候执行渲染操作。


router.get('/', function(req, res) {
	conn.query('select * from njs_userdata',function(err,res,fields){
    if(err){throw err;}
    console.log(res);
    data = res;
		res.render('index', {
            title: 'Express',
            data:data
        });
    conn.end();
  });
});

在这个问题中,主要挑战在于理解Node.js中的异步操作。当你执行数据库查询时,该操作是异步的,这意味着它不会立即完成。因此,你需要在查询完成后处理结果。以下是一个解决方案的示例代码:

var mysql = require('mysql');
var express = require('express');
var router = express.Router();

// 创建数据库连接
var conn = mysql.createConnection({
    host: 'localhost',
    port: '3306',
    user: 'root',
    password: '',
    database: 'user'
});

router.get('/', function(req, res) {
    // 执行数据库查询
    conn.query('SELECT * FROM njs_userdata', function(err, results, fields) {
        if (err) throw err;
        
        // 查询完成后渲染页面,并将查询结果传递给模板
        res.render('index', {
            title: 'Express',
            data: results
        });

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

module.exports = router;

解释

  1. 数据库连接:首先创建一个数据库连接对象。
  2. 路由设置:定义了一个GET请求处理函数。
  3. 数据库查询:在路由处理函数内部执行数据库查询。由于这是异步操作,所以查询结果将在回调函数中可用。
  4. 渲染模板:在查询回调中,使用查询得到的结果数据渲染模板,并传递给客户端。
  5. 关闭连接:在响应渲染后关闭数据库连接。

这样,你可以确保在渲染模板之前,数据库查询已经完成并且结果已经被正确捕获。

回到顶部