JavaScript如何校验用户输入的账号信息是否存在于user.json文件中
实现方案
你当前的实现是启动时一次性读取user.json到内存,需要先确保文件读取完成再启动Express服务,避免请求进来时存储凭证的变量还未初始化的问题。校验逻辑核心就是比对输入的账号是否在凭证对象的键中、对应密码是否匹配即可。
完整修改后代码
const fs = require('fs'); const express = require('express'); const app = express(); // 配置解析POST请求Body app.use(express.urlencoded({ extended: true })); app.use(express.json()); // 提前声明存储凭证的全局变量 let credentials = null; function lookUpCredentials(filePath, cb) { fs.readFile(filePath, (err, fileData) => { if (err) { return cb && cb(err); } try { const object = JSON.parse(fileData); return cb && cb(null, object); } catch (err) { return cb && cb(err); } }); } // 凭证读取完成后再启动服务,避免未初始化就接收请求 lookUpCredentials("./user.json", (err, data) => { if (err) { console.error('用户配置文件读取失败:', err); process.exit(1); // 读取失败直接退出进程 } credentials = data; // 读取成功后启动端口监听 app.listen(3000, () => { console.log('服务启动成功,监听3000端口'); }); }); app.post('/login', (req, res) => { const username = req.body.username?.trim(); const password = req.body.password?.trim(); // 基础非空校验 if (!username || !password) { return res.status(400).json({ msg: '账号和密码不能为空' }); } // 校验账号存在性+密码匹配度 const storedPassword = credentials[username]; if (storedPassword && storedPassword === password) { // 校验通过 return res.json({ msg: '登录成功' }); } else { // 校验不通过统一返回错误,避免被恶意枚举账号 return res.status(401).json({ msg: '账号或密码错误' }); } })
额外说明
- 如果需要支持运行时修改
user.json不用重启服务,可以把lookUpCredentials的调用放到/login接口内部,每次请求都读取最新的文件内容即可,仅牺牲少量性能 - 生产环境不要明文存储密码,实际使用请用bcrypt等加密工具做密码哈希存储和校验
内容的提问来源于stack exchange,提问作者Arnab
相关产品推荐
相关产品推荐

