如何在EJS模板中渲染async异步函数返回的数据?
问题原因
EJS 默认不会等待模板内异步函数的执行结果,async 函数调用后会直接返回 Promise 实例,模板渲染时会直接将 Promise 对象转为字符串输出,也就是你看到的 [object Promise]。控制台能打印数据是因为异步函数调用后就会自行执行,只是渲染流程没有等待它返回结果。
推荐解决方案(最优)
不要将异步函数直接传入模板,按照服务端渲染的常规逻辑,在路由层提前获取所有需要渲染的数据,再将纯数据传递给EJS模板,避免在模板中处理业务逻辑:
- 修改路由代码,将回调改为异步函数,提前拉取价格数据:
app.get('/', async (req, res) => { // 预获取所有渲染所需数据 const ethereumPrice = await functions.getPrice('ethereum') res.render('dashboard.ejs', { ethereumPrice }) })
- 修改EJS模板,直接渲染拿到的结果:
<body> <p> <%= ethereumPrice %> </p> </body>
这个方案逻辑分层清晰,性能更可控,也更方便调试和后续维护。
备选方案(模板内调用异步函数)
如果确实有需要在模板内批量处理异步调用的场景,EJS 3.x及以上版本原生支持模板内使用 await 等待异步结果,直接修改模板写法即可:
<body> <p> <%- await functions.getPrice('ethereum') %> </p> </body>
注意这个方案不推荐长期使用,模板内混入异步业务逻辑会提升后续维护成本,也不利于做请求合并、缓存等性能优化。
内容的提问来源于stack exchange,提问作者PaulH
相关产品推荐
相关产品推荐

