Node.js+MySQL项目中EJS提交表单后revData未定义问题求助
解决EJS页面revData未定义及评论无法展示的问题
核心问题是你的app.post路由处理评论提交后,没有像app.get那样查询评论数据并传递给EJS模板,导致页面渲染时revData不存在;而直接在EJS里定义空数组会覆盖正常请求时的有效数据,自然看不到已有的评论。
具体解决方案:
- 封装评论查询逻辑:把查询数据库评论的代码抽成独立函数,避免重复编写:
// 假设你用mysql2/promise连接数据库 async function fetchReviews() { // 按创建时间倒序获取评论,确保最新评论排在前面 const [reviews] = await db.query('SELECT * FROM customer_reviews ORDER BY created_at DESC'); return reviews; }
- 统一路由数据传递逻辑:在
app.get和app.post中都调用上述函数,确保渲染页面时都传入评论数据:
- GET请求路由(页面首次加载):
app.get('/reviews', async (req, res) => { const revData = await fetchReviews(); res.render('reviews', { revData }); });
- POST请求路由(提交评论后):
app.post('/submit-review', async (req, res) => { // 1. 将新评论插入数据库 const { username, comment } = req.body; await db.query( 'INSERT INTO customer_reviews (username, comment) VALUES (?, ?)', [username, comment] ); // 2. 查询最新的评论列表 const revData = await fetchReviews(); // 3. 渲染页面并传入评论数据 res.render('reviews', { revData }); });
- 调整EJS模板代码:无需手动定义空数组,通过条件判断处理空评论场景即可:
<div class="comments-section"> <% if (revData && revData.length > 0) { %> <% revData.forEach(rev => { %> <div class="comment-card"> <h4><%= rev.username %></h4> <p><%= rev.comment %></p> <small class="comment-date"><%= rev.created_at %></small> </div> <% }) %> <% } else { %> <p>暂无评论,快来发表第一条评论吧!</p> <% } %> </div>
这样处理后,无论是首次访问页面的GET请求,还是提交评论后的POST请求,都会查询最新的评论数据并传递给EJS模板,既不会出现revData未定义的错误,也能正常展示所有评论。
内容的提问来源于stack exchange,提问作者enrikokun
相关产品推荐
相关产品推荐

