You need to enable JavaScript to run this app. JavaScript如何校验用户输入的账号信息是否存在于user.json文件中
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.12 17:24:02