J'utilise le code suivant pour obtenir les détails d'un utilisateur lorsque je passe son identifiant comme paramètre:

   server.get("/users/:id", (req, res) => {
        const itemId = req.params.id;

        dbCollection.findOne({ _id: itemId }, (error, result) => {
            if (error) throw error;
            // return item
            res.json(result);
        });
    });

Cependant, cela ne semble pas fonctionner, car chaque fois que j'exécute le code, je suis renvoyé avec une valeur nulle. Ma question n'est pas la même que celle de nombreuses questions précédemment posées car j'ai ObjectId('randomId') comme identifiant, et non une chaîne. Comment puis-je corriger mon code?

1
SomeName 2 juin 2020 à 21:41

3 réponses

Meilleure réponse

req.params.id est une chaîne tandis que votre _id est un ObjectId donc cela ne fonctionnera pas car MongoDB nécessite d'abord l'égalité de type, vous devez convertir la valeur:

const itemId = mongoose.Types.ObjectId(req.params.id);
1
mickl 2 juin 2020 à 18:54

Comme d'autres l'ont déjà dit, MongoDB s'attend à ce que _id soit un ObjectID. Mais si vous recherchez UN élément, au lieu d'utiliser findOne, utilisez findById, qui accepte id sous forme de chaîne.

const { Model } = require('./models'); // Model is your Mongoose Schema

server.get("/users/:id", async (req, res) => {
   const { id } = req.params;

   // This is the same as Model.findOne({ _id: new ObjectId(id) });
   const item = await Model.findById(id);

   return res.json(item);
});
1
Daniel Cunha 2 juin 2020 à 20:18

MongoDB ne considérerait pas le "itemId" comme un identifiant MongoDB, vous devez donc le transformer comme indiqué ci-dessous:

new mongodb.ObjectId(itemId)

Ceci implique que:

const mongodb = require('mongodb')
1
Fillyjonk 2 juin 2020 à 18:55