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

