EJS页面无法读取动态JS变量问题求助
问题:EJS视图无法渲染动态传递的message变量
作为后端编程新手,我在使用EJS+Express路由+数据库的注册场景中遇到问题:当密码不匹配或邮箱已被使用时,控制器中传递的message变量无法通过<%= message %>在EJS视图kayit_ol中显示出来。
相关代码
主文件 index.js
const express = require("express"); const app = express(); const path = require('path'); const dotenv = require('dotenv') ; dotenv.config({path:'./.env'}) app.set("view engine", "ejs"); app.use(express.static('public')); app.use(express.static('node_modules')); app.use(express.urlencoded({ extended: false })); //false yerine true da koyulabilir. app.use(express.json()); //Define routes app.use('/',require('./routes/pages')); app.use('/auth',require('./routes/auth')); app.listen(3000, () => { console.log("Listening on port 3000"); });
控制器 auth.js
const jwt = require('jsonwebtoken'); const bcrypt = require('bcryptjs'); const db_kullanici_auth = require("../data/kullanici_auth_db"); //数据库导入 exports.register = async (req, res) => { try { const { company_name_reg, name_reg, surname_reg, department_name_reg, position_name_reg, password_reg, password_confirm_reg, adres_reg, adres2_reg, zip_reg, sehir_reg, ulke_reg, telefon_kodu_reg, telefon_numarasi_reg, email_reg } = req.body; await (db_kullanici_auth.execute('SELECT email FROM register WHERE email = ? ', [email_reg], (error, results) => { if (error) { console.log(error); } if (results.length > 0) { console.log(results); return res.render('kayit_ol', { message: '邮箱已被使用' }); } else if (password_reg !== password_confirm_reg) { console.log(results); return res.render('kayit_ol', { message: '密码不匹配' }); } // let hashedPassword = await bcrypt.hash(password_reg,8) ; // console.log(hashedPassword) ; })); } catch (error) { console.log(error); } }
路由 auth.js
const express = require('express') ; const router = express.Router() ; const authController = require('../controllers/auth'); router.post("/kayit_ol",authController.register); module.exports = router ;
问题原因及修复方案
核心问题:异步逻辑混用导致变量传递失效
你在await后混用了数据库操作的回调函数,这会让await无法正确等待数据库查询完成,同时回调内部的res.render可能因为异步上下文问题,无法将message变量正确传递给EJS视图。
具体修复步骤
改用数据库操作的Promise版本
去掉回调函数,直接用await接收数据库返回结果(如果使用mysql2等支持Promise的库,默认支持这种写法):exports.register = async (req, res) => { try { const { password_reg, password_confirm_reg, email_reg } = req.body; // 用await直接接收查询结果,去掉回调 const [results] = await db_kullanici_auth.execute('SELECT email FROM register WHERE email = ? ', [email_reg]); if (results.length > 0) { return res.render('kayit_ol', { message: '邮箱已被使用' }); } else if (password_reg !== password_confirm_reg) { return res.render('kayit_ol', { message: '密码不匹配' }); } // 后续密码加密和注册逻辑... } catch (error) { console.log(error); return res.render('kayit_ol', { message: '服务器内部错误' }); } }确保EJS视图正确处理变量
在kayit_ol.ejs中先判断message是否存在,再渲染:<% if (typeof message !== 'undefined' && message) { %> <div class="error-notice"><%= message %></div> <% } %>补充GET路由加载注册页
在routes/pages.js中添加注册页的GET路由,确保用户首次访问时能正常加载视图:router.get('/kayit_ol', (req, res) => { res.render('kayit_ol'); // 首次加载不传递message });
内容的提问来源于stack exchange,提问作者Tolkienist Coder
相关产品推荐
相关产品推荐

