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

NextJS登录接口500错误排查:用户/密码验证逻辑问题

问题分析与修复方案

你的代码里有两个关键问题,导致输入错误用户或密码时返回500错误:

  • 未及时终止请求流程:当查询不到用户时,if (!user)代码块里只生成了响应但没加return,程序会继续往下执行。此时user是undefined,后续访问user.password会直接抛出类型错误,被catch捕获后返回500状态。
  • 提前访问不存在的属性:console.log(user.password)写在了用户存在性判断之前,只要用户不存在,这行代码就会先触发"Cannot read properties of undefined"错误,直接进入catch块返回500。

修正后的代码

import { connect } from "@/dbConfig/dbConfig";
import User from "@/models/userModel";
import { NextRequest, NextResponse } from "next/server";
import bcryptjs from "bcryptjs";
import jwt from "jsonwebtoken";

connect();

export async function POST(request: NextRequest) {
  try {
    const reqBody = await request.json();
    const { password, email } = reqBody;

    console.log(reqBody);

    // 检查用户是否存在
    const user = await User.findOne({ email });
    if (!user) {
      return NextResponse.json(
        { message: "用户不存在" },
        { status: 400, statusText: "User does not exist" }
      );
    }

    // 确认用户存在后再打印密码(生产环境建议删除此日志)
    console.log(user.password);

    // 检查密码是否正确
    const validPassword = await bcryptjs.compare(password, user.password);
    if (!validPassword) {
      return NextResponse.json(
        { message: "密码错误" },
        { status: 400, statusText: "Invalid Password" }
      );
    }

    // 生成token数据
    const tokenData = {
      id: user._id,
      username: user.username,
      email: user.email,
    };

    // 创建token
    const token = jwt.sign(tokenData, process.env.TOKEN_SECRET!, {
      expiresIn: "1d",
    });

    const response = NextResponse.json({
      message: "登录成功",
      success: true,
    });

    response.cookies.set("token", token, { httpOnly: true });

    return response;
  } catch (error: any) {
    return NextResponse.json({ error: error.message }, { status: 500 });
  }
}

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.14 06:30:12