NodeJS fs.writefile正在我的express应用程序中无限循环POST请求

eanckbw9  于 2022-12-03  发布在  Node.js
关注(0)|答案(5)|浏览(161)

我有这个当前的服务器代码:

const express = require("express")
const fs = require("fs")
const router = express.Router()
const path = require("path")

const todos = JSON.parse(fs.readFileSync(path.join(__dirname, "../db", "todolist.json"), "utf8"))

router.get("/", async (req, res) => {
    res.send(todos)
})

router.post("/new", async (req, res) => {
    const { title, description } = req.body

    const todoItem = {
        id: "3",
        title,
        description
    }

    todos.todos.push(todoItem)

    const data = JSON.stringify(todos, null, 2)

    fs.writeFile(path.join(__dirname, "../db", "todolist.json"), data, () => {}) 
    res.status(201).json(todoItem)
})

委托人:

console.log("Hello world!")

const somedata = {
    title: "A new boy",
    description: "Recieved from the client"
}

const main = async () => {
    const response1 = await fetch("http://localhost:3000/todo", {
        method: "GET",
    })
    const data1 = await response1.json()

    const response2 = await fetch("http://localhost:3000/todo/new", {
        method: "POST",
        body: JSON.stringify(somedata), 
        headers: {
            'Content-Type': 'application/json',
            "Accept": "application/json"
        }
    })

    const data2 = await response2.json()

    return { data1, data2 }
}

main().then(data => console.log(data))

当我发出一个/POST请求来创建一个新实体时,浏览器只是一遍又一遍地循环请求,直到我手动退出服务器。如果我出于某种原因使用postman,就不会发生这种情况。有人看到这里writeFile方法的使用有什么明显的错误吗?为什么它不断地重新加载浏览器来不断地推送POST请求?
谢谢!:)

zf2sa74q

zf2sa74q1#

我也有同样的问题!我花了大约1个小时才明白我的问题是什么:
如果您使用“live server extension”,服务器将在每次写入,更改或删除项目文件夹中的文件时重新启动!

因此,如果您的节点应用程序写入文件,live-服务器将重新启动,应用程序将再次写入文件!=〉loop

在我的例子中,我写了一个pdf文件。我所要做的就是告诉live服务器扩展忽略pdf文件:
所以我只是添加到“settings.json”:
“实时服务器.设置.忽略文件”:["**/*.pdf”]

dm7nw8vv

dm7nw8vv2#

fs.writeFile是异步函数。所以,要发送一个响应after文件,你必须在回调中完成。当然,不要忘记错误检查。

router.post("/new", async (req, res) => {
    const { title, description } = req.body

    const todoItem = {
        id: "3",
        title,
        description
    }

    todos.todos.push(todoItem)

    const data = JSON.stringify(todos, null, 2)

    fs.writeFile(path.join(__dirname, "../db", "todolist.json"), data, (err) => {
   if(err) {
       throw err;
    }
   res.status(201).json(todoItem)
  }) 
 })

或者,您可以使用fs.writeFileSync作为前面提到的Muhammad

b4lqfgs4

b4lqfgs43#

我想我找到问题了。当我把客户端和服务器放在不同的端口上时,live服务器扩展似乎把事情搞砸了,使得浏览器为每一个请求刷新。我切换回它们共享端口,这样就可以工作了。我必须找到一个好的方法在以后的基础上把它们分开而不发生这个bug,但那是以后的事了。
感谢您的帮助:)

u59ebvdq

u59ebvdq4#

我分享了我的工作示例。需要body-parser依赖来获取post请求中的body。请不要更改server.js中的顺序。检查一下并让我知道。并且还要检查一次您的客户端代码是否在循环中。
我的服务器. js

const express = require("express")
const fs = require("fs")
const router = express.Router()
const path = require("path")
const app = express();
const bodyParser = require("body-parser")
const todos = JSON.parse(fs.readFileSync(path.join(__dirname, "../db", "todolist.json"), "utf8"))

app.use(bodyParser.json());

app.use("/",router)
router.get("/todo", async (req, res) => {
    res.send(todos)
})

router.post("/todo/new", async (req, res) => {
    const { title, description } = req.body
    const todoItem = {
        id: "3",
        title,
        description
    }

    todos.todos.push(todoItem)
    const data = JSON.stringify(todos, null, 2)
    fs.writeFile(path.join(__dirname, "../db", "todolist.json"), data, () => {})
    res.status(201).json(todoItem)
});

app.listen(3000, () => {
    console.log(`Server running in Port`);
});

todolist.json

{
  "todos": []
}
0ejtzxu1

0ejtzxu15#

我认为您应该使用fs.writeFileSync()或在其回调中编写一些代码

相关问题