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

Node.js与Express跨文件访问对象的方法及登录问题解决

问题描述

开发Node.js + Express项目时,hash.js负责处理用户注册与登录逻辑:注册时会存储用户名和加密后的密码,但登录时始终提示User Not Found!。尽管在hash.js中声明了let users = []存储用户,却无法在登录路由中正确匹配到已注册用户。

相关代码

hash.js

const express = require("express");
const bcrypt = require("bcrypt");
const router = express.Router();
const app = express();
let users = [];
app.use(express.json());

router.post('/register', async (req, res) => {
      try {
          const salt = await bcrypt.genSalt();
          const passwordHash = await bcrypt.hash(req.body.password, salt);
          users.push({username: req.body.username, password: passwordHash});
         res.json(users);
       } 
      catch (e) {
           res.status(500).send(e.toString());
   }
});

router.post('/login', async (req, res) => {
    try {
      const user = users.find(user => user.username = req.body.username);
      console.log(user);
   if (!user) {
      res.status(400).send('User Not Found!');
    }
   if (await bcrypt.compare(req.body.password, user.password)) {
      res.send('LoggedIn');
     } else {
         res.send('Not Valid User!');
     }
}   catch (e) {
        console.log(e.toString());
  }
})

module.exports=router;

app.js

const express = require('express');
var app = express();
var bodyParser=require('body-parser');
app.use(express.urlencoded({extended:false}));
app.use(express.json());
app.use(bodyParser.json());
app.use(express.static('public'));
const jwt=require('jsonwebtoken');
const bcrypt = require("bcrypt");
const path=require('path');
const hash=require("./hash");
app.use('/static', express.static(path.join(__dirname, 'public')))

const port=3000;

// Import routes
const authRouter = require("./routes/auth.js");
const messagesRouter = require("./routes/messages.js");

app.get('/', (req,res)=>{
  res.send("hello world");
});

// Setup all the routes
app.use("/api/messages", messagesRouter);
app.use("/api/auth", authRouter);
app.use("/", hash);

app.use("/", hash);
app.listen(port, () => {
  console.log(`Example app listening on port ${port}`)
});
解决方案

1. 修复find方法的逻辑错误

登录路由中users.find(user => user.username = req.body.username)使用了赋值运算符=,而非比较运算符===,导致每次调用都会修改数组中用户的username,无法正确匹配目标用户。

修改为:

const user = users.find(user => user.username === req.body.username);

2. 终止不存在用户的后续逻辑

当用户不存在时,需终止后续代码执行,避免因user.password引发报错:

if (!user) {
  return res.status(400).send('User Not Found!');
}

3. 移除冗余代码

  • hash.js中无需创建独立的app实例,路由模块依赖主app的中间件配置即可,删除以下代码:
    const app = express();
    app.use(express.json());
    
  • app.js中重复挂载了hash路由,删除其中一次app.use("/", hash);

4. 修复后完整代码

hash.js

const express = require("express");
const bcrypt = require("bcrypt");
const router = express.Router();

let users = [];

router.post('/register', async (req, res) => {
  try {
    const salt = await bcrypt.genSalt(10); // 指定加盐轮次,提升安全性
    const passwordHash = await bcrypt.hash(req.body.password, salt);
    users.push({ username: req.body.username, password: passwordHash });
    res.json(users);
  } catch (e) {
    res.status(500).send(e.toString());
  }
});

router.post('/login', async (req, res) => {
  try {
    const user = users.find(user => user.username === req.body.username);
    console.log(user);
    
    if (!user) {
      return res.status(400).send('User Not Found!');
    }

    const isPasswordValid = await bcrypt.compare(req.body.password, user.password);
    if (isPasswordValid) {
      res.send('LoggedIn');
    } else {
      res.send('Not Valid User!');
    }
  } catch (e) {
    console.log(e.toString());
    res.status(500).send('Server Error');
  }
});

module.exports = router;

app.js

const express = require('express');
const app = express();
const bodyParser = require('body-parser');
const jwt = require('jsonwebtoken');
const bcrypt = require("bcrypt");
const path = require('path');
const hash = require("./hash");

app.use(express.urlencoded({ extended: false }));
app.use(express.json());
app.use(express.static('public'));
app.use('/static', express.static(path.join(__dirname, 'public')));

const port = 3000;

const authRouter = require("./routes/auth.js");
const messagesRouter = require("./routes/messages.js");

app.get('/', (req, res) => {
  res.send("hello world");
});

app.use("/api/messages", messagesRouter);
app.use("/api/auth", authRouter);
app.use("/", hash);

app.listen(port, () => {
  console.log(`Example app listening on port ${port}`);
});

额外注意事项

  • 当前用内存数组users存储用户,服务器重启后数据会丢失,实际项目建议使用数据库(如MongoDB、MySQL)持久化存储用户信息;
  • bcrypt.genSalt()可指定轮次(如10),轮次越高加密越安全,但耗时也会增加。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.16 13:35:30