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

如何在不刷新页面的前提下将MongoDB数据传递至EJS文件

无刷新语言转换功能实现方案

核心逻辑:放弃同步表单提交+服务端渲染返回的模式,改用异步接口传输JSON数据,前端通过JS拦截提交行为、动态更新页面内容,全程不会触发页面刷新。

后端(app.js)修改

替换原有POST路由逻辑,把无内容的204响应改为返回JSON格式的转换结果,补充异常容错:

// 提前在路由定义前加这行中间件,支持解析JSON请求体
app.use(express.json());

app.post("/", async (req, res) => {
  try {
    const txtareaStr = req.body.phoneticTxtArea;
    // 兼容多空格、首尾空字符的分割逻辑
    const txtareaArr = txtareaStr.trim().toLowerCase().split(/\s+/);
    const convertArrOfArrs = [];
    for (let i = 0; i < txtareaArr.length; i++) {
      const word = await Word.findOne({ phonetic: txtareaArr[i] });
      // 词库无匹配时保留原词,避免空值报错
      convertArrOfArrs.push(word ? word.converted : txtareaArr[i]);
    }
    // 返回200状态+转换结果JSON
    res.status(200).json({ convertResult: convertArrOfArrs });
  } catch (e) {
    console.log("转换错误:", e);
    res.status(500).json({ error: "服务端转换异常" });
  }
});

前端(index.ejs)修改

给页面元素加唯一标识,拦截表单默认提交行为,通过fetch发送异步请求,拿到结果后直接更新第二个文本域内容:

<!-- 输入区域 -->
<form id="convertForm">
  <textarea id="phoneticInput" name="phoneticTxtArea" rows="8" cols="60" placeholder="请输入要转换的内容"></textarea>
  <button type="submit">转换</button>
</form>

<!-- 结果输出区域 -->
<textarea id="convertOutput" rows="8" cols="60" readonly placeholder="转换结果将展示在这里"></textarea>

<script>
const form = document.getElementById('convertForm');
const inputArea = document.getElementById('phoneticInput');
const outputArea = document.getElementById('convertOutput');

form.addEventListener('submit', async (e) => {
  // 阻止表单默认提交跳转/刷新行为
  e.preventDefault();
  // 发送异步请求
  const response = await fetch('/', {
    method: 'POST',
    headers: {
      'Content-Type': 'application/json'
    },
    body: JSON.stringify({
      phoneticTxtArea: inputArea.value.trim()
    })
  });
  const resData = await response.json();
  if (resData.convertResult) {
    // 扁平化转换结果数组,拼接为字符串写入输出域,要追加就把=改成+=
    outputArea.value = resData.convertResult.flat().join(' ');
  }
})
</script>

关键注意事项

  • 原有res.status(204).send()的作用是返回无内容响应,本身无法携带任何数据,必须替换为JSON响应才能把转换结果传回前端。
  • 如果需要保留每次转换的历史结果,只需要把输出域赋值逻辑从outputArea.value = 转换内容改为outputArea.value += 转换内容 + '\n',即可实现追加效果。
  • 不需要引入额外第三方依赖,原生fetch API即可实现所有无刷新交互逻辑,兼容所有现代浏览器。
  • 如果你之前仅配置了express.urlencoded()表单解析中间件,和新增的express.json()中间件可以同时存在,不会产生冲突。

内容的提问来源于stack exchange,提问作者Karan Sandhu

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.02 09:39:20