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

Fetch API触发按钮时res.render无法渲染EJS局部视图的解决方法

问题:Fetch POST请求触发Express res.render无法渲染EJS局部视图

点击按钮通过Fetch API发送POST请求时,Express的res.render无法将EJS局部视图渲染到页面上。已查阅相关资料但现有方案无效,无报错信息,客户端与服务端console.log均正常输出。需求是通过按钮触发渲染EJS局部视图,后续将用其他按钮替换该视图,先解决当前渲染问题。

服务端代码(server.js)

const { request } = require('express')
const express = require('express')
const app = express()
app.set('view engine','ejs')
app.use(express.static('public'))
app.use(express.json({limit: '1mb'}))

app.get('/',(req,res)=>{
    res.render('layout')
})

app.post('/',async(req,res)=>{
     try {
    res.render('./partials/hi')
   } catch (error) {
    console.log(error)
   }
})

app.listen(5000,()=>{
    console.log('server listening')
})

客户端代码(main.js)

const button = document.getElementById('button')

button.addEventListener('click',()=>{
// const hi = document.createElement(`<%-require('../views/partials/hi.ejs')%>`)

// document.appendChild(hi)
console.log('no')

const options = {
    method : 'POST',
}

fetch('/', options)
})

解决方案

核心问题:Fetch属于AJAX异步请求,服务端res.render默认生成的是完整页面响应,但客户端未对返回的HTML内容做处理,导致页面无变化。

1. 修改服务端接口,返回渲染后的HTML字符串

将POST接口改为把局部视图渲染成HTML字符串,通过JSON格式返回给客户端:

app.post('/', async (req, res) => {
  try {
    // 用回调获取渲染后的HTML内容
    res.render('./partials/hi', (err, html) => {
      if (err) throw err;
      res.json({ html });
    });
  } catch (error) {
    console.error('渲染错误:', error);
    res.status(500).json({ error: '局部视图渲染失败' });
  }
})

2. 客户端处理返回的HTML并插入页面

在客户端接收服务端返回的HTML,插入到页面指定容器中(需提前在layout.ejs中添加容器):

const button = document.getElementById('button')
// 页面中需存在用于放置局部视图的容器
const partialContainer = document.getElementById('partial-container')

button.addEventListener('click', async () => {
  try {
    const response = await fetch('/', {
      method: 'POST',
      headers: {
        'Content-Type': 'application/json',
      }
    })
    
    if (!response.ok) throw new Error('请求失败')
    const data = await response.json()
    
    // 将HTML插入容器
    partialContainer.innerHTML = data.html
  } catch (error) {
    console.error('操作出错:', error)
  }
})

3. 补充页面容器(layout.ejs)

在layout.ejs中添加承载局部视图的容器:

<!DOCTYPE html>
<html>
<head>
  <meta charset="UTF-8">
  <title>页面布局</title>
</head>
<body>
  <button id="button">加载局部视图</button>
  <!-- 局部视图容器 -->
  <div id="partial-container"></div>
  <script src="/main.js"></script>
</body>
</html>

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.07 23:01:34