Как ждать возвращения мангуста? - PullRequest
0 голосов
/ 26 марта 2019

Я создал CRUD с NodeJS / Mongoose, разделил файлы в стиле MVC. В примере маршрута, который я показываю ниже, при выполнении подпрограммы retrieveOne необходимо дождаться ее обработки, а затем перенаправить пользователя на тот или иной маршрут. Я хотел бы использовать Bluebird, чтобы ждать обработки. Мне нужна помощь, чтобы реализовать рутину.

Index.js -------------------------------------------- ---

const myCRUD = require('./api/controllers/controller')

router.post('/login', function(req, res, next) {   

   // HOW TO IMPLEMENT BLUEBIRD HERE?

   // How to wait for the "retrieveOne" process and a then do a "if" test (below)?   
   let ret = myCRUD.retrieveOne({ name: "abc test" }); 


   if(!ret) {
      res.redirect('/success')
   } else {
      res.redirect('/error')
   }
})

controller.js ------------------------------------------

const mongoose = require('mongoose');
const Schema = require('./schema-user');
const Model = mongoose.model('users', Schema);

const CRUD = {
   retrieveOne: function(query) {
      Model.findOne(query, function(err, result) {
         if (err) return err;
         return result;
      });
   }
}

module.exports = CRUD;

Примечание : Я уже нашел несколько примеров с Bluebird и без него прямо здесь, в S.O., но я не смог заставить его работать: Примеры: 1 , 2 , 3 , 4 , 5

Ответы [ 2 ]

2 голосов
/ 26 марта 2019

Вам не нужно использовать Bluebird для этого, так как mongoose прекрасно работает с нативными обещаниями

В вашем контроллере:

const mongoose = require('mongoose');
const Schema = require('./schema-user');
const Model = mongoose.model('users', Schema);

const CRUD = {
   retrieveOne: function(query) {
      // findOne() returns a Promise ()
      // https://mongoosejs.com/docs/promises.html
      return Model.findOne(query);
   }
}

module.exports = CRUD;

Теперь вы можете сделать свой обработчик маршрута функцией async и просто await Обещанием

const myCRUD = require('./api/controllers/controller')

router.post('/login', async function(req, res, next) { 
   let ret = await myCRUD.retrieveOne({ name: "abc test"}); 
   if(!ret) {
      res.redirect('/success')
   } else {
      res.redirect('/error')
   }
})
1 голос
/ 26 марта 2019

Использование async и await

const myCRUD = require('./api/controllers/controller')
const Promise = require('bluebird');

router.post('/login', async function(req, res, next) {   

   // HOW TO IMPLEMENT BLUEBIRD HERE?

   // How to wait for the "retrieveOne" process and a then do a "if" test (below)?   
   let ret = await myCRUD.retrieveOne('{ name: "abc test"'); 


   if(!ret) {
      res.redirect('/success')
   } else {
      res.redirect('/error')
   }
})

// controller.js ------------------------------------------

const mongoose = require('mongoose');
const Schema = require('./schema-user');
const Model = mongoose.model('users', Schema);

const CRUD = {
   retrieveOne: function(query) {
      return new Promise((resolve, reject) => {
        Model.findOne(query, function(err, result) {
           if (err) reject(err);
           resolve(result);
        });
      });
   }
}

module.exports = CRUD;
...