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

如何让EJS在变量未提供时不报错并使用默认值?

解决EJS模板未传入变量时报错并设置默认值的问题

当在YAML文件中使用EJS模板时,期望未传入变量时自动使用默认值,但直接判断变量值会触发postgres_credentials_secret_name is not defined错误,报错信息如下:

postgres_credentials_secret_name is not defined
    at eval (eval at compile (/Users/paymahn/code/goldsky/strick/infra/node_modules/ejs/lib/ejs.js:662:12), <anonymous>:107:17)
    at anonymous (/Users/paymahn/code/goldsky/strick/infra/node_modules/ejs/lib/ejs.js:692:17)
    at Object.exports.render (/Users/paymahn/code/goldsky/strick/infra/node_modules/ejs/lib/ejs.js:423:37)
    at Immediate.run (/Users/paymahn/code/goldsky/strick/infra/node_modules/ejs/bin/cli.js:201:20)
    at processImmediate (node:internal/timers:466:21) {
  path: ''
}

尝试过两种写法均失败:
尝试1:

<% if(postgres_credentials_secret_name) { %>
name: <%- postgres_credentials_secret_name %>
<% } else { %>
name: graph-node-postgres-credentials
<% } %>

尝试2:

name: <%- postgres_credentials_secret_name || 'graph-node-postgres-credentials' %>

错误原因

当变量未被传入EJS模板时,直接引用变量会触发未定义错误——EJS不会将未传入的变量视为undefined进行逻辑判断,而是直接抛出异常。必须先检查变量是否存在,再处理默认值。

解决方案

方法1:用typeof检查变量是否定义

通过typeof判断变量是否存在,避免未定义报错:

<% if (typeof postgres_credentials_secret_name !== 'undefined') { %>
name: <%- postgres_credentials_secret_name %>
<% } else { %>
name: graph-node-postgres-credentials
<% } %>

方法2:通过locals对象访问变量

EJS中所有传入的变量都会挂载到locals对象上,直接访问locals的属性不会触发未定义错误:

name: <%- locals.postgres_credentials_secret_name || 'graph-node-postgres-credentials' %>

方法3:使用ES空值合并运算符(??)

如果你的Node.js版本支持ES2020+,可以用??精准处理undefined或null的情况(不会将0、空字符串等合法falsy值替换为默认值):

name: <%- locals.postgres_credentials_secret_name ?? 'graph-node-postgres-credentials' %>

方法4:渲染时传入默认值(推荐)

在调用EJS渲染方法时,提前传入包含默认值的对象,模板中可直接使用变量,无需额外判断:

// Node.js环境下的渲染示例
const ejs = require('ejs');

ejs.renderFile('your-template.yaml', {
  postgres_credentials_secret_name: process.env.SECRET_NAME || 'graph-node-postgres-credentials'
}, (err, renderedContent) => {
  // 处理渲染结果
});

模板中只需简单写:

name: <%- postgres_credentials_secret_name %>

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.23 04:37:02