如何实现MongoDB存储的含EJS变量文本的变量值注入?
问题:EJS模板变量无法在Ajax取回后自动注入值
我希望将包含EJS变量的文本存储到MongoDB数据库中,通过Ajax取回后自动替换变量值,但目前取回的文本仍保留原始模板语法(如Hello <%= booking.nameOfGuest %>),无法显示为实际的用户数据(如Hello Louis)。需求是实现用户可自定义的自动消息,并能预填充到文本域中。
现有可运行代码
Ajax 部分
<script> $('select').on('change', function (e) { // 切换语言 var optionSelected = $("option:selected", this); var valueSelected = this.value; $.ajax({ url: "../retrieveParameter", type: "get", data: { name: valueSelected + "_message_sendkey" }, success: function(data) { $("#message-accessCode").val(data.value); }, error: function(data) { } }); }); </script>
控制器部分
const Parameter = require("../model/parameter"); exports.retrieveParameter = async (req, res) => { try { const parameter = await Parameter.findOne({ name: req.body.name }); res.json({ value: parameter.value }); } catch (err) { console.log(err); } };
数据库文档示例
{ "_id": { "$oid": "642ee81165040a00eae95575" }, "name": "fr_message_sendkey", "__v": 0, "value": "Hello <%= booking.nameOfGuest %> ! Thank you for your booking <%= booking.code %> ..." }
解决方案
EJS模板的变量替换默认是服务端渲染行为,直接返回原始模板文本不会自动解析变量,以下是两种可行的解决方式:
方式一:服务端完成模板渲染后返回
在后端取出模板文本后,结合业务数据渲染成最终文本再返回给前端:
- 安装EJS依赖(未安装时执行):
npm install ejs
- 修改控制器代码:
const Parameter = require("../model/parameter"); const ejs = require("ejs"); exports.retrieveParameter = async (req, res) => { try { // 此处根据实际业务逻辑获取对应的booking数据,示例数据仅作演示 const booking = { nameOfGuest: "Louis", code: "BK12345" }; // 注意:GET请求的参数需要从req.query获取,而非req.body const parameter = await Parameter.findOne({ name: req.query.name }); if (!parameter) { return res.status(404).json({ error: "参数不存在" }); } // 用EJS渲染模板文本 const renderedText = ejs.render(parameter.value, { booking }); res.json({ value: renderedText }); } catch (err) { console.log(err); res.status(500).json({ error: "获取并渲染参数失败" }); } };
方式二:前端完成模板渲染
如果需要在前端处理变量替换,可以选择以下两种子方案:
子方案A:前端使用EJS渲染
- 在页面引入前端版EJS脚本:
<script src="https://cdn.jsdelivr.net/npm/ejs@3.1.9/ejs.min.js"></script>
- 修改Ajax的success回调函数:
success: function(data) { // 假设前端已获取到对应的booking数据 const booking = { nameOfGuest: "Louis", code: "BK12345" }; // 渲染模板 const renderedText = ejs.render(data.value, { booking }); $("#message-accessCode").val(renderedText); }
子方案B:简单字符串替换(适合变量较少的场景)
如果模板中的变量数量不多,直接用正则表达式替换更轻量:
success: function(data) { const booking = { nameOfGuest: "Louis", code: "BK12345" }; let renderedText = data.value .replace(/<%= booking.nameOfGuest %>/g, booking.nameOfGuest) .replace(/<%= booking.code %>/g, booking.code); $("#message-accessCode").val(renderedText); }
内容的提问来源于Stack Exchange,提问作者Louie
相关产品推荐
相关产品推荐

