J'ai ce code serveur actuel:
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))
client:
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) })
Quand je fais une requête / POST pour créer une nouvelle entité le navigateur boucle simplement la demande encore et encore jusqu'à ce que je doive quitter manuellement le serveur. Cela ne se produit pas si j'utilise le facteur pour une raison quelconque. Est-ce que quelqu'un voit une erreur évidente ici avec la façon dont la méthode writeFile est utilisée et pourquoi elle recharge continuellement le navigateur pour continuer à pousser les requêtes POST?
Merci! :)
5 Réponses :
Je pense que vous devriez utiliser fs.writeFileSync ()
ou écrire du code dans son callback
J'ai essayé cela aussi mais je n'ai malheureusement pas fonctionné. Writefilesync et writefile avec ou sans callback ne fonctionnent pas, ils bouclent tous les deux le navigateur pour actualiser et faire une nouvelle demande de publication indéfiniment. Cela ne se produit pas si j'utilise un autre type de client, comme le facteur, alors cela fonctionne comme prévu.
fs.writeFile
est une fonction asynchrone. Donc, pour envoyer une réponse après
le fichier écrit, vous devez le faire dans le callback. Et bien sûr, n'oubliez pas la vérification des erreurs. Ie
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) }) })
Ou vous pouvez utiliser fs.writeFileSync
comme Muhammad a> mentionné précédemment.
Merci, mais j'ai essayé les deux solutions et elles n'ont pas aidé: (il n'y a pas eu d'erreur renvoyée par le rappel et l'utilisation de la méthode syncronous ne l'a pas changée même si je le pensais au départ
Ok, je vais essayer de reproduire votre problème et je vous répondrai
Notez que mon serveur est sur PORT 3000, tandis que mon client est sur l'extension de serveur en direct PORT 5500 (utilisant des cors pour transférer la demande), mais cela ne devrait pas arriver?
Je pense avoir trouvé le problème. Il semblait que l'extension de serveur en direct gâchait les choses lorsque le client et le serveur étaient sur des ports séparés, ce qui permettait d'actualiser le navigateur pour chaque demande faite d'une manière ou d'une autre. Je suis revenu à leur port de partage, ce qui le fait ensuite fonctionner. Je dois trouver un bon moyen de les séparer ultérieurement sans que ce bug ne se produise, mais c'est pour une autre fois.
Merci pour votre aide :)
Ouais, le rechargement à chaud ne fonctionne pas toujours comme prévu :)
Je partage ma dépendance de travail sample.body-parser est nécessaire pour obtenir le corps dans la demande de publication. Veuillez ne pas changer l'ordre dans server.js.Check et me le faire savoir. et vérifiez également une fois si votre code client est en boucle.
Mon serveur.js
{ "todos": [] }
todolist.json
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`); });
J'ai eu le même problème! Et il m'a fallu environ 1 heure pour comprendre quel est mon problème:
Si vous utilisez "l'extension de serveur en direct", le serveur redémarrera à chaque fois, lorsque vous écrivez, modifiez ou supprimez un fichier dans le dossier du projet!
Donc, si votre application de nœud a écrit un fichier, le serveur en direct redémarrera et l'application réécrira le fichier! => boucle
Dans mon cas, j'écris un fichier pdf. Tout ce que j'avais à faire, c'est de dire à l'extension du serveur en direct d'ignorer les fichiers pdf:
Je viens donc d'ajouter à "settings.json":
"liveServer.settings.ignoreFiles": ["** / *. pdf"]
Y a-t-il quelque chose qui manque dans le code du serveur que vous avez publié? Il affiche uniquement un itinéraire
/
get et un itinéraire postal/ todo
. Mais, le code client affiche un GET to / todo et un POST to / todo / new?J'utilise la fonctionnalité de routeur express, dans le server.js (qui n'est pas inclus ici), vous pouvez spécifier les itinéraires comme celui-ci mais cela ne fait pas partie du problème.