web-dev-qa-db-fra.com

Comment utiliser la mangouste Promise - Mongo

Quelqu'un peut-il me donner un exemple sur la façon d'utiliser une promesse avec une mangouste? Voici ce que j'ai, mais cela ne fonctionne pas comme prévu:

app.use(function (req, res, next) {
  res.local('myStuff', myLib.process(req.path, something));
  console.log(res.local('myStuff'));
  next();
});

puis dans myLib, j'aurais quelque chose comme ça:

exports.process = function ( r, callback ) {
  var promise = new mongoose.Promise;
  if(callback) promise.addBack(callback);

  Content.find( {route : r }, function (err, docs) {
     promise.resolve.bind(promise)(err, docs);

  });

  return promise;

};

À un moment donné, je m'attends à ce que mes données soient présentes, mais comment puis-je y accéder ou y accéder?

43
user600314

Dans la version actuelle de Mongoose, la méthode exec() renvoie une promesse, vous pouvez donc effectuer les opérations suivantes:

exports.process = function(r) {
    return Content.find({route: r}).exec();
}

Ensuite, lorsque vous souhaitez obtenir les données, vous devez les faire asynchroniser:

app.use(function(req, res, next) {
     res.local('myStuff', myLib.process(req.path));
     res.local('myStuff')
         .then(function(doc) {  // <- this is the Promise interface.
             console.log(doc);
             next();
         }, function(err) {
             // handle error here.
         });
});

Pour plus d'informations sur les promesses, il y a un merveilleux article que j'ai récemment lu: http://spion.github.io/posts/why-i-am-switching-to-promises.html

46

Mongoose utilise déjà des promesses, lorsque vous appelez exec() sur une requête.

var promise = Content.find( {route : r }).exec();
29
konsumer

Notes de version de Mongoose 4.

Mongoose 4.0 apporte de nouvelles fonctionnalités intéressantes: validation de schéma dans le navigateur, middleware de requête, validation à la mise à jour, et promesses d'opérations asynchrones .

Avec [email protected] vous pouvez utiliser toutes les promesses que vous souhaitez

var mongoose = require('mongoose');
mongoose.Promise = require('bluebird');

Un autre exemple avec le polyfilling global.

require('es6-promise').polyfill();
var mongoose = require('mongoose');

Donc, vous pouvez le faire plus tard

Content
  .find({route : r})
  .then(function(docs) {}, function(err) {});

Ou

Content
  .find({route : r})
  .then(function(docs) {})
  .catch(function(err) {});

P.S. Mangouste 5.

Mongoose 5.0 utilisera les promesses natives par défaut si disponibles, sinon aucune promesse. Vous pourrez toujours définir une bibliothèque de promesses personnalisée à l'aide de mongoose.Promise = require('bluebird');, cependant, mpromise ne sera pas pris en charge.

22
Alexey B.

Je crois que tu cherches

exports.process = function ( r, callback ) {
  var promise = new mongoose.Promise;
  if(callback) promise.addBack(callback);

  Content.find( {route : r }, function (err, docs) {
     if(err) {
       promise.error(err);
       return;
     }
     promise.complete(docs);

  });

  return promise;

};
5
deedubs

Sur cette page: http://mongoosejs.com/docs/promises.html

Le titre est Brancher votre propre bibliothèque Promises

0
Mr.Thanks