如何让Express仅在MySQL查询结果返回后再渲染HTML?
修复并优化你的Express数据库查询路由
看起来你写了个基础的Express路由,用来从数据库取数据传给Handlebars模板,但代码好像没写完,还有几个可以调整的地方。先把你的原始代码贴出来:
var express = require('express'); var router = express.Router(); var db = require('./../db'); /* GET home page. */ router.get('/', (req, res, next) => { // get db connection db.connection.connect((error) => { if (error) throw error; }); var query = `SELECT S.store_id, S.name, S.city, S.state FROM Store S`; db.connection.query(query, (error, results, fields) => { if (err...
我帮你把代码补全并优化了一下,解决几个常见问题:
var express = require('express'); var router = express.Router(); var db = require('./../db'); /* GET home page. */ router.get('/', (req, res, next) => { // 一般数据库模块会用连接池,不需要每次请求手动调用connect const query = `SELECT S.store_id, S.name, S.city, S.state FROM Store S`; db.connection.query(query, (error, results) => { // 错误处理:把错误传给Express的全局错误中间件,不要直接throw if (error) { return next(error); } // 将查询结果传给Handlebars模板,这里假设模板文件是index.hbs res.render('index', { title: '门店列表', stores: results // 模板里可以用{{#each stores}}遍历数据 }); }); }); module.exports = router;
给你说说几个关键的优化点:
- 连接复用:如果你的
db模块用了连接池(比如mysql的createPool),不需要每次请求都调用connect(),连接池会自动帮你管理连接的创建和释放,避免连接泄漏。 - 错误处理:直接
throw error会导致服务器崩溃,应该把错误传给next(),让Express的错误处理中间件统一处理。 - 模板传参:用
res.render()把查询结果results以stores的名字传给Handlebars模板,这样在模板里就能直接遍历这个数据集合了。 - 变量规范:把
var换成const(因为查询语句不会改变),让代码更严谨。
内容的提问来源于stack exchange,提问作者Eric
相关产品推荐
相关产品推荐

