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

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视图。

具体修复步骤

  1. 改用数据库操作的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: '服务器内部错误' });
        }
    }
    
  2. 确保EJS视图正确处理变量
    在kayit_ol.ejs中先判断message是否存在,再渲染:

    <% if (typeof message !== 'undefined' && message) { %>
        <div class="error-notice"><%= message %></div>
    <% } %>
    
  3. 补充GET路由加载注册页
    在routes/pages.js中添加注册页的GET路由,确保用户首次访问时能正常加载视图:

    router.get('/kayit_ol', (req, res) => {
        res.render('kayit_ol'); // 首次加载不传递message
    });
    

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.08 07:05:33