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

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;

错误原因分析

  1. authenticatedUser函数逻辑错误
    在过滤用户数组时,错误使用users.username和users.password(这是整个用户数组的属性,而非单个用户对象的属性),正确的应该是user.username和user.password——因为filter的回调参数是数组中的每个用户实例。这个错误导致永远无法匹配到正确用户,直接返回false,触发登录失败响应。

  2. 参数传递方式不匹配(潜在隐患)
    登录接口用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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.16 02:52:49