Node.js EJS模板嵌入函数为内联脚本输出[object Object]问题求助
问题根因
你遇到的[object Object]输出是两个基础实现细节遗漏导致的:
- EJS标签混淆:你用的
<%= %>默认会对输出内容做HTML转义,且拼接时会对非字符串值调用JS对象默认的toString()方法;如果传入的是普通对象,默认toString()就会直接返回[object Object]。适合嵌入内联脚本的是不做转义的<%- %>标签。 - 值序列化处理缺失:直接把函数、对象这类非字符串类型的JS值传给模板时,没有做对应的格式转换,导致隐式转义输出了错误的内容。同时你之前给输出内容套了单引号括号的写法,就算内容正确也会被转成普通字符串,无法作为可执行代码运行。
正确实现方案
如果你要嵌入的是initUser函数本身
- 首先确认服务端传入的
initUser是纯函数引用,不是包裹了函数的对象,可以先在路由里打印typeof initUser验证,确保输出function。 - 模板内联脚本修改为如下写法:
<body> <h1>An EJS template</h1> <script> // 用<%- %>输出未转义的函数源码,直接赋值给变量即可执行 const initUser = <%- initUser %>; // 直接调用函数 initUser(); </script> </body>
如果你实际要嵌入的是用户数据对象
如果initUser本质是存储用户信息的普通对象,需要在服务端先序列化为JSON字符串再传入模板:
- 路由代码修改为:
app.get('/*', (req, res) => { res.render('test-template', { // 先把对象转成标准JSON字符串,避免默认toString输出[object Object] initUser: JSON.stringify(initUser), }); });
- 模板脚本同样用
<%- %>输出原始JSON内容:
<script> // 输出的是可直接使用的JS对象,无转义问题 const initUser = <%- initUser %>; </script>
内容的提问来源于stack exchange,提问作者jerfp
相关产品推荐
相关产品推荐

