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

fs.readFileSync读取admins.json失败,重启后ADMINS数组为空

问题:重启服务器后ADMINS数组无法从admins.json加载数据

我尝试将用户名和密码数据存储到ADMINS数组,并保存至admins.json文件。期望重启服务器后,ADMINS数组能加载该文件中的数据,但每次执行console.log(ADMINS)时,输出均为空数组。

我的代码

const express = require('express');
const app = express();
const jwt = require('jsonwebtoken');
app.use(express.json());
const fs = require('fs')

let ADMINS = [];
let USERS = [];
let COURSES = [];

console.log(ADMINS);
try {
  ADMINS = JSON.parse(fs.readFileSync('admins.json', 'utf8'));
  USERS = JSON.parse(fs.readFileSync('users.json', 'utf8'));
  COURSES = JSON.parse(fs.readFileSync('courses.json', 'utf8'));
} catch {
  ADMINS = [];
  USERS = [];
  COURSES = [];
}
console.log(ADMINS);

// Admin routes
var secretkeyadmin = 's3cr3tk3yadmin';
var secretkeyuser = 's3cr3tkeyuser';

const generatejwt = (admin) => {
  const token = jwt.sign({
    username: admin.username,
    password: admin.password
  }, secretkeyadmin);
  return token;
}

const authenticatejwt = (req, res, next) => {
  const h = req.headers.authentication;
  const token = h.split(' ')[1];
  if (token) {
    const t = jwt.verify(token, secretkeyadmin);
    if (ADMINS.find((a) => a.username == t.username && a.password == t.password)) {
      next();
    } else {
      res.json("user does not exist");
    }
  } else {
    res.json("wrong");
  }
}

app.post('/admin/signup', (req, res) => {
  // logic to sign up admin
  const admin = req.body;
  
  if (admin) {
    if (ADMINS.find((a) => a.username == admin.username && a.password == admin.password)) {
      res.status(403).json('try another way user exist');
    } else {
      ADMINS.push(admin);
      fs.writeFileSync('admins.json', JSON.stringify(ADMINS));
    }
    const token = generatejwt(admin);
    res.json({
      msg: "successful",
      token: token
    })
  } else {
    res.json("error");
  }
});

app.post('/admin/login', authenticatejwt, (req, res) => {
  // logic to log in admin
  res.json("login successful");
});

app.post('/admin/courses', authenticatejwt, (req, res) => {
  // logic to create a course
  const course = req.body;
  course.id = Date.now();
  COURSES.push(course);
  fs.writeFileSync('courses.json', JSON.stringify(COURSES));
});

当前控制台输出

[]
[]

admins.json文件内容

[{"username":"oojjjo","password":"1234"}]

解决方案

  • 修正文件路径:fs.readFileSync的相对路径基于服务器启动时的工作目录,而非脚本文件所在目录。改用绝对路径避免路径错误:

    // 使用__dirname获取当前脚本的绝对目录路径
    ADMINS = JSON.parse(fs.readFileSync(`${__dirname}/admins.json`, 'utf8'));
    USERS = JSON.parse(fs.readFileSync(`${__dirname}/users.json`, 'utf8'));
    COURSES = JSON.parse(fs.readFileSync(`${__dirname}/courses.json`, 'utf8'));
    
  • 捕获并打印错误详情:原代码的catch块未输出错误信息,无法定位问题。修改后可直接看到失败原因:

    catch(err) {
      console.error('读取文件失败:', err.message);
      ADMINS = [];
      USERS = [];
      COURSES = [];
    }
    

    运行后控制台会输出具体错误(如文件不存在、JSON格式错误等),帮助快速排查。

  • 检查文件权限与格式:

    • 确保服务器进程对admins.json文件有读取权限;
    • 验证admins.json的JSON格式是否合法(无多余逗号、引号不匹配等),可通过JSON校验工具确认。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.28 13:43:19