首页 > 解决方案 > node.js 为什么在重新启动服务器后,保存在 json 文件中的 post 请求中的数据会重置为初始空数组?

问题描述

我正在使用 express node.js,我正在尝试将来自 post 请求的数据保存在 json 文件中。但是由于某种原因,当我重新启动服务器时,我的发布请求中的数据应该保存在 roomDB.json 文件中,而不是保留,而是重置为初始空数组......有人可以请教吗?非常感谢您。

这是我的代码

//saving function

const fs = require("fs");
exports.save =(data, PATH) =>{
    return new Promise((resolve, reject) => {
      fs.writeFile(PATH, JSON.stringify(data), function(err) {
        if (err) {
          reject(err);
        } else {
          resolve();
        }
      });
    });
  }


// code in router file to make requests

const express = require("express");
const router = express.Router();
const fs = require("fs");
const rooms = ("./roomDB.json");
const { addRoom} = require("./rooms");


router.get("/", (req, res)=>{
       fs.readFile("roomDB.json", (err, data)=>{
         if(err) return res.status(400);
         res.send(roomDB_PATH)
       })

});

router.get("/:id", (req, res)=>{
    res.send("connect to  a room");
});


router.post("/", (req, res)=>{
    let roomName = req.body;
    if(!roomName.name){
        res.status(404);
        res.end();
        return;
    }
 let room =addRoom(roomName.name);

res.status(201).send(room)

})

module.exports = router;

 */
const uuid = require("uuid");
let roomdatas;
const {save} = require("./save");
const roomDB_PATH = "roomDB.json";

try {

  roomdatas = JSON.parse(fs.readFileSync(roomDB_PATH)); 
} catch (e) {

    roomdatas = []
    save(roomdatas, roomDB_PATH);
}

const addRoom = (roomName) => {
    roomName = roomName.trim().toLowerCase();
    const existingRoom = roomdatas.find((room) => room.name === roomName);

    if (existingRoom) {
        return { error: 'chatroom has existed' };
    }
    let room = {
        name: roomName,
        id: uuid.v4(),
        messages: [],
        users: [],
        created: +new Date()
    };
    roomdatas.push(room);
    save(roomdatas, roomDB_PATH);
    return { room };
};

module.exports ={addRoom};

标签: node.jsjsonexpresshttpfs

解决方案


我假设您在JSON.parse(fs.readFileSync(roomDB_PATH));通话时遇到错误。每次启动服务器时都会运行此代码(当您将文件导入路由器文件时),如果遇到错误,则会将文件重置为空数组。尝试记录错误以查看导致它的原因。您目前正在完全抑制错误,无法说明它失败的原因。


推荐阅读