MongoDB
 sql >> Base de données >  >> NoSQL >> MongoDB

Utilisation des promesses dans les itinéraires Mongoose

Ok, d'abord utilisez-vous mongoose droit?

User est votre modèle de mangouste qui répond à des méthodes telles que findOne(query) , findOneAndUpdate(query, update, opts) etc..

Après avoir appelé l'une de ces méthodes, appelez la méthode exec() qui renvoie une requête.

Une requête n'est pas exactement une promesse et vous devrez spécifier quelles promesses Mongo utilisera. Ici, je recommanderais d'utiliser les versions natives, ajoutez donc cette ligne à votre projet :

 const mongoose = require('mongoose')
 mongoose.Promise = Promise

Maintenant, cette instruction vous rend une promesse, sympa !

User.findOne(q).exec()

Vous pouvez maintenant créer une chaîne Promise avec votre logique, par exemple :

 return User
     .findOne(_id)
     .exec()
     .then((user) => {
       return Receipt
         .findOne({ bookName: user.bookName })
         .exec()
       })
     .then((receipt) => {
            // example
            return res.status(200).json(receipt)
         }))
     })

Astuce :Je suggérerais de créer des méthodes auxiliaires afin de rendre le code encore plus propre :

/** @return {Promise} */
function findUser(id) {
  return User.findOne(id).exec()
}

/** @return {Promise} */
function findReceipt(bookName) {
  return Receipt.findOne({ bookName }).exec()
}

// example
function f(req, res) {
  const userId = req.get('id')

  return findUser(userId)
    .then((user) => findReceipt(user.bookName))
    .then((receipt) => res.status(200).json(receipt))
    .catch((err) => res.status(500).json(null))
}

// register your handler
app.get('/book', f)