为何Axios调用返回[object Promise]而非预期数据?
问题描述
我编写了一个从API获取值的异步函数,在EJS模板中调用该函数时,返回的是[object Promise]而非实际数据,但通过console.log可以正常查看所需数据。
辅助函数(Helper)
const axios = require("axios"); const getBrokerName = async (id) => { API_BROKERS_URL = `${process.env.API_URL}/api/v1/brokers/?`; const params = new URLSearchParams({ id: id, key: process.env.API_KEY, }); try { const {data} = await axios.get(`${API_BROKERS_URL}${params}`); console.log(data.name) return data.name } catch (error) { console.log(err) } } module.exports = { getBrokerName }
EJS文件
<%= helper.getBrokerName(account.broker_id) %>
执行结果
[object Promise]
请问我忽略了什么?
问题原因与解决方案
核心原因
所有async函数的返回值本质都是Promise对象,直接在EJS的<%= %>标签中调用异步函数,只会把Promise对象转换成字符串输出(也就是[object Promise]),而不会自动等待Promise完成、获取最终返回值。
可行解决方案
1. 渲染模板前提前获取数据(推荐)
不要在模板中处理异步逻辑,而是在后端路由/控制器里先批量获取好所有需要的broker名称,再把完整数据传递给EJS渲染:
// 后端路由示例(以Express框架为例) const { getBrokerName } = require('./path/to/your/helper-file'); app.get('/target-page', async (req, res) => { // 假设已通过业务逻辑获取到账户列表 const originalAccounts = await fetchYourAccounts(); // 遍历账户,批量获取对应经纪商名称 const accountsWithBrokerInfo = await Promise.all( originalAccounts.map(async account => ({ ...account, brokerName: await getBrokerName(account.broker_id) })) ); // 将处理好的数据传入模板 res.render('your-template', { accounts: accountsWithBrokerInfo }); });
之后在EJS模板中直接使用提前准备好的字段:
<%= account.brokerName %>
这种方式符合分层架构设计,避免模板逻辑复杂化,同时性能更可控。
2. 启用EJS异步渲染(仅临时小场景使用)
EJS支持异步渲染,但需要开启对应配置,且模板中要使用await:
首先在后端开启EJS的异步选项:
app.set('view engine', 'ejs'); // 启用异步渲染支持 app.set('view options', { async: true });
然后在EJS模板中使用await调用异步函数:
<%= await helper.getBrokerName(account.broker_id) %>
这种方式会让模板渲染过程因异步调用被多次阻塞,且模板逻辑混杂异步操作,不利于维护,仅适合极简单的临时场景。
额外修复点
你的辅助函数catch块中存在拼写错误:console.log(err)应该改为console.log(error),否则会抛出err is not defined的未定义变量错误。
内容的提问来源于stack exchange,提问作者Richard Branson
相关产品推荐
相关产品推荐

