You need to enable JavaScript to run this app. Node.js EJS模板嵌入函数为内联脚本输出[object Object]问题求助
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.30 17:24:01