fs.writefile在我的快速应用程序中无限地使POST请求循环



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

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 请求以创建新实体时,浏览器只是一遍又一遍地循环请求,直到我手动退出服务器。如果我出于某种原因使用邮递员,这不会发生。有没有人在这里看到任何明显的错误,包括如何使用writeFile方法以及为什么它不断重新加载浏览器以继续推送POST请求?

谢谢! :)

我遇到了同样的问题!我花了大约 1 个小时才明白我的问题是什么:

如果您使用"实时服务器扩展",则每次当您写入,更改或删除项目文件夹中的文件时,服务器都会重新启动!

因此,如果您的节点应用程序缺少一个文件,则实时服务器将重新启动,并且应用程序将再次写入该文件! =>循环

就我而言,我写了一个pdf文件。我所要做的就是告诉实时服务器扩展忽略pdf文件:

所以我只是添加到"settings.json":

"liveServer.settings.ignoreFiles":["**/*.pdf"]

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

我想我发现了问题。当我将客户端和服务器放在不同的端口上时,实时服务器扩展似乎把事情搞砸了,使浏览器刷新了以某种方式发出的每个请求。我切换回他们共享端口,然后让它工作。我必须找到一种好方法,稍后将它们分开而不会发生此错误,但那是另一回事了。

感谢您的帮助:)

我分享了我的工作样本.body-parser 依赖项需要在 post 请求中获取正文。请不要更改服务器中的顺序.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": []
}

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

最新更新