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
相关产品推荐
相关产品推荐

