Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/node.js/33.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Node.js fs.writefile正在我的express应用程序中无限地进行POST请求循环_Node.js_Google Chrome_Express_Fs - Fatal编程技术网

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),则不会发生这种情况,然后它会按预期工作。是的,很热重新加载并不总是按预期工作:)