用Node.js为网站首页绑定数据

为了使网页上的内容能够跟随数据库中记录的变化而变化,需要对静态网页绑定数据。数据绑定就是通过SQL查询读取数据库中的数据,将返回的查询结果嵌入到网页的指定元素中。Node.js数据绑定的过程分为2步:①在routes/index.js文件的路由处理函数中查询数据库并将查询结果发送给模板文件;②在页面的ejs模板文件中嵌入对应的变量。

1 首页的数据绑定

首页有多个栏目,对应多个查询结果。首页数据绑定的具体步骤如下:

1. 1 服务器端执行SQL 查询并返回数据

在routes/index.js文件中,对访问首页的路由添加如下创建查询的代码。

javascript 复制代码
const mysql = require('./../database');		//引用连接数据库模块
router.get('/', function(req, res, next) {			//首页的路由处理	 
var query = 'SELECT * FROM news ORDER BY ID DESC limit 6';
    mysql.query(query, function(err, rows, fields){
       var articles = rows;
	      console.log(articles);		//输出articles到控制台,用于调试
    res.render('index', { articles: articles }); //将articles发送给index模板
});
});

1.2 在模板文件中嵌入服务器端返回的数据

在index.ejs模板文件中嵌入数据。从图4-5可知,数组articles保存了第一个栏目的所有记录,所以要把articles数组通过遍历输出到第一个栏目的各个<li>标签中。为此,将index.ejs模板中第一个栏目中的如下ul元素代码:

html 复制代码
<ul>
 <% for(var i = 1, max = articles.length; i < max; i++) {%>
	<li><a href="/show/<%= articles[i].ID %>"><%= articles[i].title %></a>
<span>[<%= articles[i].infotime %>]</span></li>
<% } %>			
</ul>

2. 绑定多个栏目的数据

在routes/index.js文件中,添加对首页其他栏目创建查询的代码,并将所有查询的结果数据都发送给index模板。修改后的router.get()代码如下。

javascript 复制代码
router.get('/', function(req, res, next) {
	var query = 'SELECT * from news order by ID desc limit 6';
	mysql.query(query, function(err, rows, fields) {
		var articles = rows;
		articles[0].content = articles[0].content.replace(/<[^>]*>?/gm, '').slice(0, 40);
		articles.forEach(function(ele) {
			ele.infotime = formatDate(ele.infotime);
		});
		const querystring = "船山科普";		//第2个栏目
		qry2 = 'SELECT * from news where BigClassName=? order by ID desc limit 5';
		mysql.query(qry2, [querystring], function(err, rows, fields) {
			var kepu = rows;
			kepu.forEach(function(ele) {
				ele.infotime = formatDate(ele.infotime);
			});
			qry3 = 'SELECT * FROM wcszz ORDER BY ID DESC limit 3'; 	//第3个栏目
			mysql.query(qry3, function(err, rows, fields) {
				var zhuzuo = rows;
				res.render('index', {	articles: articles,kepu: kepu,zhuzuo: zhuzuo});
			});
		});
	});
});

上述代码中,通过{articles:articles, kepu: kepu, zhuzuo: zhuzuo}输出3个json数组,对应3个栏目的数据。

提示:有几个栏目,就用mysql.query()执行几个查询,一个栏目就对应一个查询的记录集(recordset)。但要注意的是:这几个mysql.query()函数并不是同级的,而是嵌套的,第2个mysql.query()要嵌入到第1个mysql.query()中,第3个要嵌入到第2个之中。

3. 解决多个mysql.query()函数嵌套的问题

由于mysql.query()函数是异步函数,因此第2个mysql.query()要嵌入到第1个mysql.query()函数的回调函数中。如果要执行n个查询,就需要n个mysql.query()函数嵌套,代码可读性差,这称为回调地狱。为此,可以使用async函数让异步函数返回值,从而不需要回调函数。解决嵌套问题。代码如下:

javascript 复制代码
const util = require('util');
const queryAsync = util.promisify(conn.query).bind(conn);
router.get('/', async function(req, res, next) {
    var query = 'select * from news order by id desc limit 6';
    var title = await queryAsync(query);    
    var query2 = "select * from news where BigClassName='学生工作' order by id desc limit 6";
    var title2 = await queryAsync(query2);    
    res.render('lm', { title: title, title2: title2 });
});

这样就完美解决了mysql.query()函数嵌套的问题。

相关推荐
宁风NF22 分钟前
JavaScript:内存、垃圾回收、性能优化
开发语言·前端·javascript·学习·性能优化·es6
午安~婉1 小时前
挑战二:博客预览卡片
前端·javascript·html
夏殇之殁12 小时前
包中创建自定义列表项。 . 使用自定义列表项进行数据绑定 . 将天气预报数据保存到本地内存表,通过LiveBindings进行显示。 ...
服务器·前端·javascript
新中地GIS开发老师13 小时前
WebGIS开发学生作品|低空航天管理与航线规划系统
前端·javascript·webgis·三维gis开发
丙氨酸長鏈14 小时前
Web前端入门第 问:JavaScript 一个简单的 IndexedDB 数据库入门示例
前端·javascript·数据库
kyriewen15 小时前
面试官让我手写虚拟列表——AI生成的版本,快速滚动几下就白屏了
前端·javascript·面试
许彰午17 小时前
政务督办的分合模式:主办协办的并发审批
前端·javascript·政务
陳陈陳17 小时前
🚀 前端流式输出革命:SSE + BFF 架构从零到一实战指南
vue.js·架构·node.js
易筋紫容17 小时前
创建型模式:对象的诞生艺术
开发语言·前端·javascript
Revolution6118 小时前
第一次运行 Node.js:终端里的 JavaScript 怎样执行
后端·面试·node.js