如何让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
相关产品推荐
相关产品推荐

