EJS代码无输出问题:Express+Passport环境下MySQL库名无法在页面渲染
问题原因
你遇到的是异步逻辑和EJS同步渲染的时序冲突问题:
database.sql是异步回调方法,EJS模板渲染本身是同步执行的,模板解析完整个页面的时候,sql的回调还没拿到数据库返回的结果,所以页面不会输出任何内容。- 模板层仅负责数据渲染,不应该直接执行数据库查询这类业务逻辑操作。
解决方法
把数据库查询逻辑移到路由层,拿到查询结果后再传递给模板渲染:
1. 修改路由代码(dashboard.js)
在sql的回调函数内执行页面渲染,把查询到的数据库名作为模板变量传入:
const router = require('express').Router() const database = require('./../database/database.js') [...] // 先执行数据库查询,拿到结果后再渲染页面 database.sql("SHOW DATABASES", 0, (rows) => { res.render('dashboard/server/main', { guilds: req.user.guilds, servers: rows, user: req.user, admin: false, points: 0, server: server, dbName: rows[0].Database // 新增数据库名变量 }) })
2. 修改模板代码(main.ejs)
直接输出路由传入的数据库名变量即可:
<%= server.guild_id %> <!-- 76593313568....704 --> <%= dbName %> <!-- 正常输出数据库名 -->
优化建议
如果你的sql方法还没有做Promise封装,建议改造为支持Promise的调用方式,后续如果有多个异步查询需求时,可以用async/await避免回调嵌套问题。
内容的提问来源于stack exchange,提问作者olios
相关产品推荐
相关产品推荐

