0
votes

fs.writefile fait une boucle de requête POST à ​​l'infini dans mon application express

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! :)


2 commentaires

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.


5 Réponses :


0
votes

Je pense que vous devriez utiliser fs.writeFileSync () ou écrire du code dans son callback


1 commentaires

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.



0
votes

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.


3 commentaires

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?



0
votes

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 :)


1 commentaires

Ouais, le rechargement à chaud ne fonctionne pas toujours comme prévu :)



0
votes

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`);
});


0 commentaires

0
votes

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"]


0 commentaires