如何在EJS视图中使用枚举映射将整型状态值转为对应展示文本
EJS中使用状态枚举映射的实现方法
EJS 模板无法直接访问服务端通过 require 引入的模块变量,必须将需要用到的变量显式注入渲染上下文,以下是两种常用实现方案:
方案1:单页面路由传参
如果状态映射只在首页用到,直接在路由渲染时把 STATUS 对象传入模板即可:
- 首先在路由文件顶部确保已经引入状态映射:
const STATUS = require("./public/js/status"); - 修改路由的
res.render逻辑,正常分支和异常分支都要把STATUS加入传入的参数对象:app.get("/", async (req, res) => { try { db.open(); const requests = await db.getRequestsByUserID(req.user.ID); db.close(); res.render("index.ejs", { requests: requests, STATUS: STATUS }); } catch (e) { console.log(`Error while showing requests: ${e}`); db.close(); res.render("index.ejs", { name: req.user.first_name, requests: [], error: "Cannot show requests", STATUS: STATUS }); } }); - 在EJS模板遍历请求列表时,直接通过状态值取映射的字符串即可:
<ul class="request-list"> <% requests.forEach(reqItem => { %> <li> <!-- 其他请求字段展示逻辑 --> <span class="status">状态:<%= STATUS[reqItem.status] %></span> </li> <% }) %> </ul>
方案2:全局注入(多页面复用推荐)
如果多个页面的模板都需要用到这个状态映射,不需要每个路由重复传参,直接在Express初始化阶段把映射挂载到 app.locals 上,所有EJS模板都可以直接访问该变量:
- 在server.js中,完成express实例初始化后、注册路由前加入以下代码:
const express = require('express'); const app = express(); const STATUS = require("./public/js/status"); // 全局注入变量,所有EJS模板无需额外传参即可直接访问STATUS app.locals.STATUS = STATUS; - 注入完成后原有路由代码不需要做任何修改,模板里的写法和方案1完全一致。
小提示:如果数据库可能存在不在枚举范围内的异常状态值,可以给展示加个兜底,避免页面出现undefined:
<%= STATUS[reqItem.status] || "未知状态" %>
内容的提问来源于stack exchange,提问作者Anton Iliev
相关产品推荐
相关产品推荐

