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

如何实现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模板的变量替换默认是服务端渲染行为,直接返回原始模板文本不会自动解析变量,以下是两种可行的解决方式:

方式一:服务端完成模板渲染后返回

在后端取出模板文本后,结合业务数据渲染成最终文本再返回给前端:

  1. 安装EJS依赖(未安装时执行):
npm install ejs
  1. 修改控制器代码:
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渲染

  1. 在页面引入前端版EJS脚本:
<script src="https://cdn.jsdelivr.net/npm/ejs@3.1.9/ejs.min.js"></script>
  1. 修改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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.25 15:03:12