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 //这里如何取到数据库查到的数组? }); });
当然可以。在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');
});
解释
-
数据库连接:
- 使用
mysql
模块创建一个数据库连接对象。 - 配置数据库连接参数(主机、端口、用户名、密码、数据库名)。
- 使用
-
设置模板引擎:
- 使用
app.set('view engine', 'ejs')
设置模板引擎为EJS。
- 使用
-
定义路由:
- 在
/
路径上定义一个GET请求处理器。 - 在回调函数中执行数据库查询。
- 如果查询成功,将结果传递给模板并渲染。
- 在
-
关闭数据库连接:
- 在渲染模板后立即关闭数据库连接。
-
启动服务器:
- 监听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>
总结
通过这种方式,你可以确保在数据库查询完成后才渲染模板,并且可以在模板中正确地显示查询结果。关键在于理解异步操作的特性,并在适当的时候执行渲染操作。
在这个问题中,主要挑战在于理解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;
解释
- 数据库连接:首先创建一个数据库连接对象。
- 路由设置:定义了一个GET请求处理函数。
- 数据库查询:在路由处理函数内部执行数据库查询。由于这是异步操作,所以查询结果将在回调函数中可用。
- 渲染模板:在查询回调中,使用查询得到的结果数据渲染模板,并传递给客户端。
- 关闭连接:在响应渲染后关闭数据库连接。
这样,你可以确保在渲染模板之前,数据库查询已经完成并且结果已经被正确捕获。