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

如何在EJS模板中渲染async异步函数返回的数据?

问题原因

EJS 默认不会等待模板内异步函数的执行结果,async 函数调用后会直接返回 Promise 实例,模板渲染时会直接将 Promise 对象转为字符串输出,也就是你看到的 [object Promise]。控制台能打印数据是因为异步函数调用后就会自行执行,只是渲染流程没有等待它返回结果。

推荐解决方案(最优)

不要将异步函数直接传入模板,按照服务端渲染的常规逻辑,在路由层提前获取所有需要渲染的数据,再将纯数据传递给EJS模板,避免在模板中处理业务逻辑:

  1. 修改路由代码,将回调改为异步函数,提前拉取价格数据:
app.get('/', async (req, res) => {
    // 预获取所有渲染所需数据
    const ethereumPrice = await functions.getPrice('ethereum')
    res.render('dashboard.ejs', { ethereumPrice })
})
  1. 修改EJS模板,直接渲染拿到的结果:
<body>
    <p>
        <%= ethereumPrice %>
    </p>
</body>

这个方案逻辑分层清晰,性能更可控,也更方便调试和后续维护。

备选方案(模板内调用异步函数)

如果确实有需要在模板内批量处理异步调用的场景,EJS 3.x及以上版本原生支持模板内使用 await 等待异步结果,直接修改模板写法即可:

<body>
    <p>
        <%- await functions.getPrice('ethereum') %>
    </p>
</body>

注意这个方案不推荐长期使用,模板内混入异步业务逻辑会提升后续维护成本,也不利于做请求合并、缓存等性能优化。


内容的提问来源于stack exchange,提问作者PaulH

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.28 06:18:02