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
    Femme Profil pro
    Étudiant
    Inscrit en
    juillet 2019
    Messages
    3
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France, Seine Saint Denis (Île de France)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : juillet 2019
    Messages : 3
    Points : 4
    Points
    4
    Par défaut 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)
            }
        })
    }
    newsModel.jsnewsController.js


    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 Avatar de tsuji
    Inscrit en
    octobre 2011
    Messages
    1 369
    Détails du profil
    Informations forums :
    Inscription : octobre 2011
    Messages : 1 369
    Points : 2 413
    Points
    2 413
    Par défaut
    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
    Femme Profil pro
    Étudiant
    Inscrit en
    juillet 2019
    Messages
    3
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France, Seine Saint Denis (Île de France)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : juillet 2019
    Messages : 3
    Points : 4
    Points
    4
    Par défaut
    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 Avatar de tsuji
    Inscrit en
    octobre 2011
    Messages
    1 369
    Détails du profil
    Informations forums :
    Inscription : octobre 2011
    Messages : 1 369
    Points : 2 413
    Points
    2 413
    Par défaut
    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.)

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Réponses: 0
    Dernier message: 15/09/2017, 11h13
  2. Méthode POST pour une requête sql
    Par killer2015 dans le forum Langage
    Réponses: 2
    Dernier message: 13/11/2016, 02h47
  3. [Débutant] Insérer un nouvel objet dans une relation 1 : n (avec une procédure stockée)
    Par Binenebi dans le forum Entity Framework
    Réponses: 9
    Dernier message: 01/05/2013, 15h08
  4. requête HTTP (méthode POST) pour récupérer XML
    Par Guillaume110376 dans le forum VBScript
    Réponses: 6
    Dernier message: 26/08/2012, 17h21
  5. Réponses: 2
    Dernier message: 07/07/2007, 17h22

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo