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

Node.js登录系统出现‘email not found’错误,求排查方案

问题描述

我用Node.js搭建登录系统,测试代码时遇到了"email not found"错误,想请教问题出在哪里?邮箱和密码的验证逻辑看似正确,但仍触发该错误。

UserModel 代码

const Users = db.define('logindata',{
    mail: {
        type: DataTypes.STRING
    },
    password: {
        type: DataTypes.STRING
    },
    isactive: {
        type: DataTypes.NUMBER
    },
    refresh_token: {
        type: DataTypes.TEXT
    }

},{

    freezeTableName:true

});

UserControl.js 代码

export const Login = async(req, res) => {
    try {
        const user = await Users.findAll({
            where:{
                mail: req.body.mail,
            }
        });
        const match = await bcrypt.compare(req.body.password, user[0].password);
        if(!match) return res.status(400).json({msg: "wrong password"});
        const userId = user[0].id;
        const mail = user[0].mail;
        const accessToken = jwt.sign({userId, mail}, process.env.ACCESS_TOKEN_SECRET,{
            expiresIn: '20s'
            
        });
        const refreshToken = jwt.sign({userId, mail}, process.env.REFRESH_TOKEN_SECRET,{
            expiresIn: '1d'
        });
        
        await Users.update({refresh_token: refreshToken},{
            where: {
                id: userId
            }
        });
        res.cookie('refreshToken', refreshToken,{
            httpOnly: true,
            maxAge: 24 * 60 * 60 * 1000,
            secure: true
        });
        res.json({accessToken});
    } 
    catch (error) {
        res.status(404).json({msg:"email not found"});
    }
}

问题原因及修复方案

核心问题

  1. 未校验查询结果是否为空:Users.findAll()返回数组,无匹配邮箱时user为空数组,此时访问user[0].password会抛出数组越界错误,直接进入catch块返回"email not found",属于错误的异常捕获逻辑。
  2. 异常捕获范围不合理:当前catch块会捕获所有异常(包括密码比对失败、JWT签名错误、数据库更新失败等),全部统一返回"email not found",无法定位真实错误。
  3. 本地测试环境Cookie设置问题:secure: true要求HTTPS环境,本地HTTP测试时Cookie无法写入,影响后续刷新令牌功能。

修正后的Login函数

export const Login = async(req, res) => {
    try {
        // 改用findOne直接返回单个用户对象,适配登录场景
        const user = await Users.findOne({
            where:{
                mail: req.body.mail,
            }
        });
        
        // 主动校验用户是否存在,返回对应提示
        if(!user) {
            return res.status(404).json({msg: "email not found"});
        }
        
        // 密码比对逻辑
        const match = await bcrypt.compare(req.body.password, user.password);
        if(!match) {
            return res.status(400).json({msg: "wrong password"});
        }
        
        // 生成访问令牌与刷新令牌
        const userId = user.id;
        const mail = user.mail;
        const accessToken = jwt.sign({userId, mail}, process.env.ACCESS_TOKEN_SECRET,{
            expiresIn: '20s'
        });
        const refreshToken = jwt.sign({userId, mail}, process.env.REFRESH_TOKEN_SECRET,{
            expiresIn: '1d'
        });
        
        // 更新用户的刷新令牌
        await Users.update({refresh_token: refreshToken},{
            where: {
                id: userId
            }
        });
        
        // 根据环境动态设置secure参数,本地开发禁用HTTPS校验
        res.cookie('refreshToken', refreshToken,{
            httpOnly: true,
            maxAge: 24 * 60 * 60 * 1000,
            secure: process.env.NODE_ENV === 'production'
        });
        
        res.json({accessToken});
    } 
    catch (error) {
        // 返回真实错误信息,便于调试排查
        res.status(500).json({msg: error.message});
    }
}

修复说明

  • 使用findOne替代findAll,简化单个用户查询逻辑。
  • 主动校验用户存在性,避免依赖异常捕获返回错误提示。
  • 缩小异常捕获范围,仅处理系统级错误并返回真实信息。
  • 根据运行环境动态配置Cookie的secure参数,适配本地开发与生产环境。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.11 04:45:30