Node.js fs.writefile正在我的express应用程序中无限地进行POST请求循环
我有以下当前服务器代码:Node.js fs.writefile正在我的express应用程序中无限地进行POST请求循环,node.js,google-chrome,express,fs,Node.js,Google Chrome,Express,Fs,我有以下当前服务器代码: 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("/",
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请求
谢谢!:) 我认为您应该使用
fs.writeFileSync()
或在其回调中编写一些代码。因此,要在写入文件后发送响应,必须在回调中执行。当然,不要忘记错误检查。即
router.post(“/new”),异步(req,res)=>{
常量{title,description}=req.body
常数todoItem={
id:“3”,
标题
描述
}
todos.todos.push(todoItem)
const data=JSON.stringify(todos,null,2)
fs.writeFile(path.join(uu dirname,“../db”,“todolist.json”),data,(err)=>{
如果(错误){
犯错误;
}
res.status(201).json(todoItem)
})
})
或者您可以使用前面提到的
fs.writeFileSync
我想我找到了问题所在。当我将客户端和服务器分别放在不同的端口上时,live server扩展似乎把事情搞砸了,使浏览器能够对每次请求进行刷新。我切换回他们的共享端口,这样就可以工作了。我必须找到一个很好的方法,在以后的基础上分离它们,而不会发生这种错误,但这是另一个时间
感谢您的帮助:)我共享了我的工作示例。需要使用body-parser依赖项才能在post请求中获取body。请不要更改server.js中的顺序。请检查并告知我。 并且还要检查一次客户机代码是否在循环中 myserver.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": []
}
我也有同样的问题!我花了大约1个小时才明白我的问题是什么: 如果使用“live server extension”,则每当您在项目文件夹中写入、更改或删除文件时,服务器都会重新启动 因此,如果您的节点应用程序创建了一个文件,live server将重新启动,应用程序将再次写入该文件!=>循环 在我的例子中,我写了一个pdf文件。我所要做的就是告诉live server extension忽略pdf文件: 因此,我只需添加到“settings.json”: “liveServer.settings.ignoreFiles”:[“***.pdf”]
您发布的服务器代码中是否缺少某些内容?它仅显示
/
获取路线和/todo
发布路线。但是,客户端代码显示了一个GET to/todo和一个POST to/todo/new?我正在使用express router功能,在server.js(此处不包括)中,您可以这样指定路由,但这不是问题的一部分。谢谢,但我尝试了这两种解决方案,但都没有帮助:(回调没有返回任何错误,使用syncronous方法也没有改变它,即使我最初这么认为OK,我将尝试重现您的问题,并将返回给您注意,我的服务器位于端口3000上,而我的客户端位于端口5500 live server extension上(使用cors通过端口传输请求),但这不应该实现?我也尝试过,但不幸的是没有成功。writefilesync和writefile(带或不带回调)都不起作用,它们都会循环浏览器进行刷新,并不确定地发出新的post请求。如果我使用其他类型的客户端(如postman),则不会发生这种情况,然后它会按预期工作。是的,很热重新加载并不总是按预期工作:)