Express/Node.js登录接口异常:提示用户名或密码错误求助
登录接口始终返回"Invalid Login"错误的排查与修复
问题概述
开发了支持用户注册与登录的简易CRUD应用,general.js中的注册接口运行正常,但调用auth_users.js中的登录接口时,始终返回{"message": "Invalid Login. Check username and password"}错误。项目结构如下:
- index.js - router - - general.js - - auth_users.js - - booksdb.js
涉及的auth_users.js核心代码:
const express = require('express'); const jwt = require('jsonwebtoken'); let books = require("./booksdb.js"); const regd_users = express.Router(); let users = []; const isValid = (username)=>{ //returns boolean //write code to check is the username is valid let userswithsamename = users.filter((user)=>{ return user.username === username }); if(userswithsamename.length > 0){ return true; } else { return false; } } const authenticatedUser = (username,password)=>{ //returns boolean //write code to check if username and password match the one we have in records. let validusers = users.filter((user)=>{ return (users.username === username &&users.password === password) }); if(validusers.length > 0){ return true; } else { return false; } } //only registered users can login regd_users.post("/login", (req,res) => { const username = req.query.username; const password = req.query.password; if (!username || !password) { return res.status(404).json({message: "Error logging in"}); } if (authenticatedUser(username,password)) { let accessToken = jwt.sign({ data: password }, 'access', { expiresIn: 60 * 60 }); req.session.authorization = { accessToken,username } return res.status(200).send("User successfully logged in"); } else { return res.status(208).json({message: "Invalid Login. Check username and password"}); } }); // Add a book review regd_users.put("/auth/review/:isbn", (req, res) => { //Write your code here return res.status(300).json({message: "Yet to be implemented"}); }); module.exports.authenticated = regd_users; module.exports.isValid = isValid; module.exports.users = users;
错误原因分析
authenticatedUser函数逻辑错误
在过滤用户数组时,错误使用users.username和users.password(这是整个用户数组的属性,而非单个用户对象的属性),正确的应该是user.username和user.password——因为filter的回调参数是数组中的每个用户实例。这个错误导致永远无法匹配到正确用户,直接返回false,触发登录失败响应。参数传递方式不匹配(潜在隐患)
登录接口用req.query获取用户名和密码,但POST请求通常通过请求体(req.body)传递敏感信息。如果注册接口用req.body接收参数,登录却用req.query,会导致参数传递不一致(比如前端用body传参,后端从query拿,自然获取不到值)。
修复方案
1. 修复authenticatedUser函数
将函数内的users改为user:
const authenticatedUser = (username,password)=>{ //returns boolean let validusers = users.filter((user)=>{ return (user.username === username && user.password === password) }); return validusers.length > 0; }
2. 统一参数获取方式(推荐)
将登录接口的参数获取改为从req.body读取,同时确保前端请求时通过body传递参数:
regd_users.post("/login", (req,res) => { const { username, password } = req.body; // 从请求体获取参数 if (!username || !password) { return res.status(400).json({message: "用户名或密码不能为空"}); } if (authenticatedUser(username,password)) { let accessToken = jwt.sign({ data: password }, 'access', { expiresIn: 60 * 60 }); req.session.authorization = { accessToken,username } return res.status(200).send("用户登录成功"); } else { return res.status(401).json({message: "登录无效,请检查用户名和密码"}); } });
注:使用
req.body需要确保Express应用中已配置express.json()或body-parser中间件,否则无法解析请求体。
内容的提问来源于stack exchange,提问作者Steven
相关产品推荐
相关产品推荐

