Partage
  • Partager sur Facebook
  • Partager sur Twitter

[Passez au Full stack avec Node.js] Bug quiz CRUD

Bug rencontré durant l'activité permettant de répondre au 2ième quiz

Sujet résolu
16 décembre 2019 à 17:18:32

Bonjour,

Je suis le cours "Passez au Full stack avec Node.js, Express et MongoDB", très bon par ailleurs !

J'en suis rendu au deuxième quiz, nécessitant de créer une API CRUD fortement inspirée de celle du cours :-)

En lançant l'application frontend fournie, voici le message :

"Created product successfully
ERROR: Could not GET all products!"

L'erreur correspond à la route : /api/products, qui doit retourner tous les produits sous la forme :
{ products: Product[] }

Comme dit plus haut, ce TP s'inspire fortement de l'activité du cours et j'ai donc un code similaire.

Comme le message l'indique, le produit est bien créé.
Et je le retrouve bien dans la base mongodb.

Mieux en me rendant sur l'adresse http://localhost:3000/api/products
Je vois bien mes données json.

En début de script, je retourne les entêtes nécessaires pour permettre l'accès :

app.use((req, res, next) =>
{
  res.setHeader('Access-Control-Allow-Origin', '*');
  res.setHeader('Access-Control-Allow-Headers', 'Origin, X-Requested-With, Content, Accept, Content-Type, Authorization');
  res.setHeader('Access-Control-Allow-Methods', 'GET, POST, PUT, DELETE, PATCH, OPTIONS');
  next();
});


J'ai ajouté des tests pour cette route :

app.get('/api/products', (req, res, next) =>
{
Product.find()
.then(products =>
{
res.status(200).json(products);
console.log("les products sont retournés : "+products);
})
.catch(error =>
{
res.status(400).json({ error });
console.error("erreurs : "+error);
});
});

Et quand je relance l'application frontend, c'est bien le premier message qui apparaît avec la liste des produits :

"les products sont retournés : {
  _id: 5df7a8aed0fad9122b6475b4,
  name: 'My test product',
  description: 'Some stuff',
  price: 40000,
  inStock: true,
  __v: 0
},{
  _id: 5df7acf4ffdb1112a7b26608,
  name: 'My test product',
  description: 'Some stuff',
  price: 40000,
  inStock: true,
  __v: 0
}"

Par ailleurs, voici ce que je vois dans la console côté frontend :

[0] Starting up http-server, serving ./
[0] Available on:
[0]   http://localhost:8081
[0] Hit CTRL-C to stop the server
[1] Impossible d'obtenir le descripteur de fichier faisant référence à la console
[1] sleep 1 && open http://localhost:8081 exited with code 1
[0] [2019-12-16T16:12:33.391Z] "GET /" "Mozilla/5.0 (X11; Ubuntu; Linux x86_64; rv:71.0) Gecko/20100101 Firefox/71.0"
[0] (node:4827) [DEP0066] DeprecationWarning: OutgoingMessage.prototype._headers is deprecated
[0] [2019-12-16T16:12:33.499Z] "GET /styles.d9dc716df0c684d997ec.css" "Mozilla/5.0 (X11; Ubuntu; Linux x86_64; rv:71.0) Gecko/20100101 Firefox/71.0"
[0] [2019-12-16T16:12:33.501Z] "GET /runtime-es2015.e8a2810b3b08d6a1b6aa.js" "Mozilla/5.0 (X11; Ubuntu; Linux x86_64; rv:71.0) Gecko/20100101 Firefox/71.0"
[0] [2019-12-16T16:12:33.501Z] "GET /polyfills-es2015.0ef207fb7b4761464817.js" "Mozilla/5.0 (X11; Ubuntu; Linux x86_64; rv:71.0) Gecko/20100101 Firefox/71.0"
[0] [2019-12-16T16:12:33.502Z] "GET /main-es2015.cef325f435f6a74f63ad.js" "Mozilla/5.0 (X11; Ubuntu; Linux x86_64; rv:71.0) Gecko/20100101 Firefox/71.0"
[0] [2019-12-16T16:12:33.955Z] "GET /favicon.ico" "Mozilla/5.0 (X11; Ubuntu; Linux x86_64; rv:71.0) Gecko/20100101 Firefox/71.0"

J'avoue que je ne vois pas d'où vient le problème et le code du frontend fourni n'est pas lisible.

Je n'ai pas besoin de répondre au quizz pour continuer le cours, donc je laisse tomber pour l'instant.

Mais si vous avez une idée de l'origine du problème, je suis preneur.

-
Edité par FabBlab 16 décembre 2019 à 17:27:06

  • Partager sur Facebook
  • Partager sur Twitter
17 décembre 2019 à 5:17:52

Bonjour,

Il faut mettre "products" avant de récupérer la liste des produits dans ton API, c'est indiqué sur l'exercice :)

  • Partager sur Facebook
  • Partager sur Twitter
17 décembre 2019 à 10:31:27

Merci, c'était bien ça !

Il fallait effectivement mettre le tableau dans un tableau ou plutôt dans un objet.
J'avais compris un tableau de "product", ce qui retour mongoose.

Bonne journée.

  • Partager sur Facebook
  • Partager sur Twitter
17 février 2020 à 16:38:52

Bonjour,

je viens vers vous car j'ai aussi un problème sur le même quiz.

Moi mon problème se situe au niveau d'appeler un produit avec son "_id".

le code que j'ai écrit fonctionne très bien sous postman, aucune erreur sur la console mais me met une erreur au niveau du frontend.

voici la partie du code concerné :

app.get('/api/products/:id', (req, res, next) =>{
    Product.findOne({ _id: req.params.id })
    .then(product => res.status(200).json({ product }))
    .catch(error => res.status(404).json({ error }));
  });

et l'erreur qui me sort : 

tous fonctionne sous postman : 

- la route POST

- la route GET pour voir tous les produits

- la route GET pour voir l'article par rapport à son _id

- la route Delete

- la route Put

Il ne me reste que cette erreur.

En espérant avoir une réponse de quelqu'un pour me mettre sur la route.

ci-joint le reste du code :

  app.use(bodyParser.json());

  app.post('/api/products', (req, res, next) =>{
    delete req.body.__v;
    const product = new Product({

        name: 'Mon premier produit',
        description: 'produit normal',
        price: '12',
        inStock: 'true'

    });
    product.save()
    .then(product => res.status(201).json({ product}))
    .catch(error => res.status(400).json({ error }));
  });

  app.put('/api/products/:id', (req, res, next) => {
  Product.updateOne({ _id: req.params.id }, {
    name: 'Mon deuxieme produit',
    description: 'produit petit',
    price: '10',
    inStock: 'false', _id: req.params.id })
  .then(thing => res.status(200).json({ message: 'Objet modifié !'}))
  .catch(error => res.status(404).json({ error }));
  });

  app.delete('/api/products/:id', (req, res, next) => {
  Product.deleteOne({ _id: req.params.id })
  .then(product => res.status(200).json({ message: 'Deleted !'}))
  .catch(error => res.status(404).json({ error }));
  });

  app.get('/api/products/:id', (req, res, next) =>{
    Product.findOne({ _id: req.params.id })
    .then(product => res.status(200).json({ product }))
    .catch(error => res.status(404).json({ error }));
  });

  app.get('/api/products', (req, res, next) =>{
    Product.find()
    .then(products => res.status(200).json( { products } ))
    .catch(error => res.status(400).json({ error }));
  });


module.exports = app;




  • Partager sur Facebook
  • Partager sur Twitter
2 avril 2020 à 16:34:58

Bonjour,

Je viens de terminer avec succès :) Je réponds donc un peu tardivement mais il est possible que l'erreur vienne de la ligne 24 :

.then(thing => res.status(200).json({ message: 'Objet modifié !'}))
C'est pas 'Objet modifié', c'est 'Modified!' le message à envoyer...
  • Partager sur Facebook
  • Partager sur Twitter
2 avril 2020 à 16:51:24

Bonjour peut tu nous montré le code l'object Product l'erreur indique que c'est au niveau du GET ( individual )

donc le controller de la route: 

GET '/api/products/:id'

j'image , mais ton controller fait des appels sur l'object Product et on as pas la définition de l'object...

Es tu sûr que le paramètre à donné et bien _id et pas juste id

// ...
Product.findOne({ _id: req.params.id })
// ...



Si ta fonction findOne attend un nombre et pas une chaîne tu pourrait la parser avant de lui donnée:

// ...
Product.findOne({ _id: parseInt( req.params.id ) })
// ...

Si le problème persiste tu peut lors de l'envoi de tes requête ( depuis le front ) faire un click droit -> "inspecter element"

onglet réseaux colonne XHR inspecter les l'état des requêtes , voir si elle parte au bon endroit avec les bon en-têtes et les bon paramètre

si ça fonctionne sur PostMan et que tu n'as pas changé ton code entre temps alors normalement c'est juste que l'envoie des requêtes et different sur ton front end.

  • Partager sur Facebook
  • Partager sur Twitter

suggestion de présentation.

27 septembre 2020 à 18:40:08

Hello ! :)

j'ai le même problème ici sur

/api/products/:id

Mon code me semble correct:

appProduct.get('/api/products/:id', (req, res, next) => {
  console.log('Produit demandé '+req.params.id);
  Product.findOne({ _id: req.params.id})
    .then(product => res.status(200).json({product}))
    .catch(error => res.status(400).json({ error }));
});


Il me retourne ça :

{
"product": {
"_id": "5f705f192a08181ca42f9f98",
"name": "My test product",
"description": "Some stuff",
"price": 40000,
"inStock": 1,
"__v": 0
}
}

Mais l'app de test me réponds "ERROR: Product found when GETting individual product is not correct!"
je me demande si y'a pas un loup entre la valeur 1 de inStock et la valeur booléenne... mais pas moyen de mettre le doigt dessus.

Update:  j'ai mis le doigts dessus :D ma définition était pourrie

  inStock: {type: Boolean, required: true},

et pas Number !! #boulay :lol:

-
Edité par Stef33560 27 septembre 2020 à 19:07:27

  • Partager sur Facebook
  • Partager sur Twitter
28 octobre 2020 à 19:37:06

Essaie {product : product} pour le get by Id et {products : products} pour le get all products


en effet je pense que votre json est de la forme

"product" : {

...

}


"products" : [{...}]

  • Partager sur Facebook
  • Partager sur Twitter
1 décembre 2020 à 16:21:56 - Message modéré pour le motif suivant : Merci d'utiliser le bouton code du forum pour insérer votre code


24 mai 2021 à 2:27:39

sorry

-
Edité par ak27 24 mai 2021 à 11:12:21

  • Partager sur Facebook
  • Partager sur Twitter
26 mai 2021 à 18:53:53

J'ai le même problème et je ne comprends pas les explications de Leyzou.

Peux-tu partager ton code ?


Merci à toi



FabBlab a écrit:

Merci, c'était bien ça !

Il fallait effectivement mettre le tableau dans un tableau ou plutôt dans un objet.
J'avais compris un tableau de "product", ce qui retour mongoose.

Bonne journée.



  • Partager sur Facebook
  • Partager sur Twitter
27 mai 2021 à 21:12:18

J'ai résolu ce problème grâce à stackoverflow:

https://stackoverflow.com/questions/67680295/node-js-mongoose-findone-id-req-params-id-doesnt-work

HoudaïfaMofril a écrit:

J'ai le même problème et je ne comprends pas les explications de Leyzou.

Peux-tu partager ton code ?

Merci à toi

-
Edité par ak27 27 mai 2021 à 21:27:54

  • Partager sur Facebook
  • Partager sur Twitter
29 mai 2021 à 14:00:53

Merci pour ta réponse ak27.

Cependant mon problème se situe à ce niveau là :

app.get('/api/products/', (req, res) =>{
Product.find()
.then(products => res.status(200).json(products))
.catch(error => res.status(400).json({error}));
});

Lorsque je lance les TEST, le premier est réussi et le second bloque:

1) Created product successfully

2) ERROR: Could not GET all products!

Le code que j'ai posté au-dessus se trouve dans le fichier app.js

Lorsque je fait un console.log() au au niveau du then, cela m'affiche dans la console tout les produits créer :

app.get('/api/products/', (req, res) =>{
Product.find()
.then(products => console.log(products))
.catch(error => res.status(400).json({error}));
});

D'où peux-venir le problème ?

  • Partager sur Facebook
  • Partager sur Twitter
3 septembre 2021 à 18:22:22

C Ok j'ai trouvé  mon erreur !


Merci pour votre aide.

-
Edité par 31B0 3 septembre 2021 à 21:28:45

  • Partager sur Facebook
  • Partager sur Twitter
6 septembre 2021 à 11:26:12

Bonjour

Si vous pouviez me donner une explication, elle serait grandement appréciée. J'ai le même pb que beaucoup sur la recherche par findOne.

Voici le code :

app.get('/api/products/:id', (req, res, next) => {
  console.log(req.params.id);
  
  Product.findOne({_id: req.params.id})
  .then(product => res.status(200).json({product}))
  .catch(error => res.status(404).json({ error }));
  

});

Voici la réponse du terminal

{
  name: 'y produit',
  description: 'le moins cher',
  price: 1110,
  inStock: false,
  _id: new ObjectId("6135dbefca22d6cc0d16be8a"),
  __v: 0
}
6135dbefca22d6cc0d16be8a



et si je saisis directement l'url du produit

Donc pourquoi ce message d'Erreur ????

Merci par avance pour votre aide.

  • Partager sur Facebook
  • Partager sur Twitter
15 octobre 2021 à 20:09:36 - Message modéré pour le motif suivant : Merci d'utiliser le bouton code du forum pour insérer votre code