MongoDB
 sql >> Datenbank >  >> NoSQL >> MongoDB

Verwendung von Promises in Mongoose-Routen

Ok, zuerst benutzt du mongoose Rechts?

User ist Ihr Mungo-Modell, das auf Methoden wie findOne(query) antwortet , findOneAndUpdate(query, update, opts) usw..

Rufen Sie nach dem Aufruf einer dieser Methoden die Methode exec() auf die eine Abfrage zurückgibt.

Eine Abfrage ist nicht gerade ein Promise und Sie müssen angeben, welche Promises Mongo verwenden soll. Hier würde ich empfehlen, die nativen zu verwenden, also fügen Sie diese Zeile in Ihrem Projekt hinzu:

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

Nun, diese Anweisung gibt Ihnen ein Versprechen zurück, schön!

User.findOne(q).exec()

Sie können jetzt eine Versprechenskette mit Ihrer Logik erstellen, zum Beispiel:

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

Tipp:Ich würde vorschlagen, Aux-Methoden zu erstellen, um den Code noch sauberer zu machen:

/** @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)