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

EJS文件中script标签内使用官方ejs.render示例代码报错“people未定义”的解决办法

解决EJS在script标签内render时变量未定义的问题

嘿,我明白你为啥踩坑了——你把客户端浏览器环境下的EJS用法直接放到了服务端预编译的EJS模板文件里,上下文搞混导致报错了!

问题根源

官方示例是纯客户端运行的:浏览器加载ejs.js后,直接在前端JS里调用ejs.render,模板字符串和变量都在浏览器上下文里。但当你把这段代码放进EJS模板文件时,服务端会先解析模板里的<%= ... %>标签,这时候服务端根本没有定义people变量,自然就报“变量未定义”的错了。

两种解决方案

方案1:继续用客户端EJS渲染(前端动态生成内容)

要让服务端跳过解析script里的EJS模板标签,需要对标签进行转义,确保它原封不动传到浏览器:

<script src="ejs.js"></script>
<script>
  // 前端定义变量
  let people = ['geddy', 'neil', 'alex'];
  // 转义模板里的EJS标签,避免服务端提前解析
  let html = ejs.render('<\%= people.join(", "); %>', {people: people});
  // 把渲染后的内容插入页面
  document.getElementById('target').innerHTML = html;
</script>
<div id="target"></div>

或者用EJS的<%- %>标签输出原始模板字符串,也能达到同样效果:

<script src="ejs.js"></script>
<script>
  let people = ['geddy', 'neil', 'alex'];
  // 用<%- %>输出未转义的模板字符串
  let html = ejs.render(<%- "'<%= people.join(', ') %>'" %>, {people: people});
  document.getElementById('target').innerHTML = html;
</script>
<div id="target"></div>

方案2:改用服务端EJS渲染(推荐,更符合EJS常规用法)

如果不需要前端动态渲染,直接在服务端把变量传给模板,然后在模板里直接使用EJS标签:

  1. 服务端代码(以Express为例):
app.get('/', (req, res) => {
  // 服务端定义变量
  let people = ['geddy', 'neil', 'alex'];
  // 把变量传给EJS模板
  res.render('your-template', { people });
});
  1. EJS模板文件(your-template.ejs):
<!-- 直接在模板里使用服务端传过来的变量 -->
<p>成员列表:<%= people.join(", ") %></p>

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.04.29 18:52:39