You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.29 02:54:02