Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

  1. #1
    Candidat au Club
    API REST: méthode POST pour insérer un nouvel objet dans un fichier JSON
    Bonsoir!
    Je débute en nodeJs et je dois réaliser une API.
    J'ai un fichier JSON qui contient des Nouvelles. Je dois pouvoir renvoyer une nouvelle par Id, insérer une nouvelle, supprimer une nouvelle ou mettre à jour une nouvelle.
    Pour l'instant j'ai réussi à faire GetById.
    Je bloque sur POST(pour insérer une nouvelle dans mon JSON)

    ci-joint le code de mon newsModels :
    Code :Sélectionner tout -Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    'use strict'
     
    const fs = require('fs')
    const path = require('path')
     
     
    //task object constructor
    var Nouvelle = function(nouvelle) {
     
        this.Id_nouvelle = nouvelle.Id_nouvelle;
        this.Nom_nouvelle = nouvelle.Nom_nouvelle;
        this.Description = nouvelle.Description;
        this.Date_generation = nouvelle.Date_generation;
     
    };
     
     
    Nouvelle.postNouvelle = function postNouvelle(newsToAdd, res) {
     
        let nouvellePath = path.join(__dirname, '../../data/nouvelles.json')
     
        fs.readFile(nouvellePath, (err, data) => {
            if (err) {
                res.sendStatus(500)
            }
            let nouvelles = JSON.parse(data)
     
            let findeNews = nouvelles.find((obj) => obj.Id_nouvelle === newsToAdd.Id_nouvelle)
            if (!findeNews) {
     
                //data[newsToAdd] = JSON.parse(data)
                fs.writeFile(nouvellePath, JSON.stringify(newsToAdd,null, 4), (error) => {
                    if(error){
                      res.sendStatus(500)
                    console.log('news added')
                  }
                })
                res.sendStatus(201)
            }
        }
        )
    }
     
     
    Nouvelle.getNouvelle = function getNouvelle(Id_nouvelle, callback) {
     
        let nouvellePath = path.join(__dirname, '../../data/nouvelles.json') //à modifietr il faut chercher à definir une variable à portée global poura être utilisée dant tous les fichiers
        fs.readFile(nouvellePath, (err, data) => {
            if (err) {
                callback(err)
                return
            }
            let nouvelles = JSON.parse(data)
            let findeNews = nouvelles.find((obj) => obj.Id_nouvelle === Id_nouvelle)
            if (findeNews) {
                console.log(findeNews)
                callback(null, findeNews)
            }
        })
     
    }
     
    module.exports = Nouvelle


    et newsController :
    Code :Sélectionner tout -Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    'use strict'
     
    //let express = require('express')
    let Nouvelle = require('../Models/newsModel')
     
     
    exports.recuperer_une_nouvelle = function(req, res) {
     
        Nouvelle.getNouvelle(req.params.Id_nouvelle, (err, nouvelle) => {
            if (err) {
                res.send(err)
            }
     
            res.json(nouvelle.Description)
        })
     
    }
     
    exports.inserer_une_nouvelle = function(req, res) {
     
        var newsToAdd = new Nouvelle(req.body);
     
        Nouvelle.postNouvelle(newsToAdd, function(err, nouvelle){
            if (err) {
                res.send(err)
            }
            else{
              res.json(nouvelle)
            }
        })
    }





    voilà à quoi ressemble mon JSON :
    Code :Sélectionner tout -Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    [
     
              {
                "Id_nouvelle": "1",
                "Nom_nouvelle":"météo du jour",
                "Description": "le jeudi 24 octobre il fait 16°",
                "Date_generation": "24/10/2019"
              },
              {
                "Id_nouvelle": "2",
                "Nom_nouvelle":"Londre ce matin!",
                "Description": "les 32 morts dans le camion sont de nationnalité chinoise",
                "Date_generation": ""
              },
              {
                "Id_nouvelle": "3",
                "Nom_nouvelle":"Vacances scolaires!",
                "Description": "Cette année il n'y aura pas de vacances pour les master 2!!!",
                "Date_generation": "01/09/2019"
              }
     
      ]

    Merciii d'avance!!!

  2. #2
    Membre émérite
    Peut-être la ligne commentée doit être simplement écrite comme ça pour ajouter newsToAdd à la fin de nouvelles ? Et puis, la ligne de fs.writeFile n'est pas correcte non plus ?
    Code nodejs :Sélectionner tout -Visualiser dans une fenêtre à part
    1
    2
    3
    4
    //data[newsToAdd] = JSON.parse(data)
    nouvelles.push(newsToAdd)
    //fs.writeFile(nouvellePath, JSON.stringify(newsToAdd,null, 4), (error) => {
    fs.writeFile(nouvellePath, JSON.stringify(nouvelles,null, 4), (error) => {

  3. #3
    Candidat au Club
    Le problème persiste!
    voici un screen de mon terminal et l'erreur renvoyée
    API server started on: 3000
    POST /Nouvelle 500 6.806 ms - 1401
    TypeError: Cannot read property 'Id_nouvelle' of undefined
    at new Nouvelle (/home/labiodh/.nvm/JSAU/jsau-apiserver/src/Models/newsModel.js:10:33)
    at exports.inserer_une_nouvelle (/home/labiodh/.nvm/JSAU/jsau-apiserver/src/Controllers/newsController.js:21:21)
    at Layer.handle [as handle_request] (/home/labiodh/.nvm/JSAU/jsau-apiserver/node_modules/express/lib/router/layer.js:95:5)
    at next (/home/labiodh/.nvm/JSAU/jsau-apiserver/node_modules/express/lib/router/route.js:137:13)
    at Route.dispatch (/home/labiodh/.nvm/JSAU/jsau-apiserver/node_modules/express/lib/router/route.js:112:3)
    at Layer.handle [as handle_request] (/home/labiodh/.nvm/JSAU/jsau-apiserver/node_modules/express/lib/router/layer.js:95:5)
    at /home/labiodh/.nvm/JSAU/jsau-apiserver/node_modules/express/lib/router/index.js:281:22
    at Function.process_params (/home/labiodh/.nvm/JSAU/jsau-apiserver/node_modules/express/lib/router/index.js:335:12)
    at next (/home/labiodh/.nvm/JSAU/jsau-apiserver/node_modules/express/lib/router/index.js:275:10)
    at logger (/home/labiodh/.nvm/JSAU/jsau-apiserver/node_modules/morgan/index.js:144:5)

  4. #4
    Membre émérite
    Mais le message se dit assez clair : il dit que newsToAdd est probablement (à voir) "undefined". Par conséquent, la ligne
    Code :Sélectionner tout -Visualiser dans une fenêtre à part
     let findeNews = nouvelles.find((obj) => obj.Id_nouvelle === newsToAdd.Id_nouvelle)
    est erronée pour ça.

    Or, newToAdd provient de newsController.js, notamment,
    Code :Sélectionner tout -Visualiser dans une fenêtre à part
    var newsToAdd = new Nouvelle(req.body);
    Donc, il faut faire un contrôle sur req.body : un console.log() pour voir par exemple.

    A part de regarder req, vous vous construissez un objet articificial juste pour tester la fonctionalité à la suite.
    Code :Sélectionner tout -Visualiser dans une fenêtre à part
    1
    2
    3
    4
    var newsToAdd = new Nouvelle(req.body);
    console.log(newsToAdd);
    newsToAdd=new Nouvelle('{"Id_nouvelle": "999", "Nom_nouvelle":"peu importe", "Description": "peu importe", "Date_generation": "15/11/2019"}')
    //continuer les mêmes


    Comme ça, vous pouvez continuer à tester la fonctionalité d'insertion; et tout en même temps, faites une investigation de quoi il s'agit mal de req. Voilà ! (Si ce n'était pas votre code ou que vous ne le compreniez pas d'un bout à l'autre, ce serait difficile à déboguer : c'est vrai.)