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

