我有这个当前的服务器代码:
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请求?
谢谢!:)
5条答案
按热度按时间zf2sa74q1#
我也有同样的问题!我花了大约1个小时才明白我的问题是什么:
如果您使用“live server extension”,服务器将在每次写入,更改或删除项目文件夹中的文件时重新启动!
因此,如果您的节点应用程序写入文件,live-服务器将重新启动,应用程序将再次写入文件!=〉loop
在我的例子中,我写了一个pdf文件。我所要做的就是告诉live服务器扩展忽略pdf文件:
所以我只是添加到“settings.json”:
“实时服务器.设置.忽略文件”:["**/*.pdf”]
dm7nw8vv2#
fs.writeFile
是异步函数。所以,要发送一个响应after
文件,你必须在回调中完成。当然,不要忘记错误检查。或者,您可以使用
fs.writeFileSync
作为前面提到的Muhammad。b4lqfgs43#
我想我找到问题了。当我把客户端和服务器放在不同的端口上时,live服务器扩展似乎把事情搞砸了,使得浏览器为每一个请求刷新。我切换回它们共享端口,这样就可以工作了。我必须找到一个好的方法在以后的基础上把它们分开而不发生这个bug,但那是以后的事了。
感谢您的帮助:)
u59ebvdq4#
我分享了我的工作示例。需要body-parser依赖来获取post请求中的body。请不要更改server.js中的顺序。检查一下并让我知道。并且还要检查一次您的客户端代码是否在循环中。
我的服务器. js
todolist.json
0ejtzxu15#
我认为您应该使用
fs.writeFileSync()
或在其回调中编写一些代码