NodeJS提交EJS表单后res.render无法渲染页面问题
表单提交后无法渲染目标页面的问题修复
提交注册表单后页面仅刷新,无法跳转到verify-email页面,GET请求能正常渲染signup页面,客户端验证通过后确实会触发表单提交,但无任何报错信息。以下是问题根源和修复方案:
1. 控制器文件导出错误(核心问题)
signupController.js存在两处致命错误:
- 错误使用逗号表达式导出函数,实际只会导出最后一个值
- 错误导出了不存在的
router对象
修复后的signupController.js:
const renderSignup = (req, res) => { res.render("signup"); }; const postSignupData = (req, res) => { res.render("verify-email"); }; // 正确导出两个控制器函数 module.exports = { renderSignup, postSignupData };
2. 路由文件导入与导出错误
- 路由文件未导出
router对象,导致服务器无法注册该路由 - 导入控制器函数时未正确解构,拿到的不是目标函数
修复后的signupRoutes.js:
const express = require('express'); const router = express.Router(); // 解构导入控制器中的两个函数 const { renderSignup, postSignupData } = require('../controllers/signupController.js'); router.get('/', renderSignup); router.post('/', postSignupData); // 必须导出router,否则服务器无法识别该路由 module.exports = router;
3. 表单输入框缺少name属性(潜在问题)
express的urlencoded中间件依赖表单元素的name属性解析请求体,目前输入框只有id没有name,后续处理用户数据时会导致req.body为空。
修改signup.ejs中的表单输入框,添加name属性:
<label for="email">Email:</label> <input id="email" name="email" type="text"><br><br> <label for="password">Password:</label> <input id="password" name="password" type="password"><br><br> <label for="password">Confirm Password:</label> <input id="confirm-password" name="confirm-password" type="password"><br><br>
4. 前端全局变量优化(可选)
当前前端代码中errorCount是全局变量,容易引发意外问题,建议改成让checkInputs函数返回错误数:
signupform.addEventListener('submit', (e) => { e.preventDefault(); const errorCount = checkInputs(); if(errorCount === 0){ signupform.submit(); } }); function checkInputs () { const email = document.getElementById("email").value.trim(); const password = document.getElementById("password").value.trim(); const confirmPassword = document.getElementById("confirm-password").value.trim(); let errorCount = 0; // 原验证逻辑保持不变 return errorCount; };
内容的提问来源于stack exchange,提问作者mughil singh
相关产品推荐
相关产品推荐

