2017-01-16 7 views
1

Можно ли обработать запрос db.model.find() внутри контекст функции и получить в результате без с использованием возвратов и обещает с библиотекой мангустов?Синхронного мангуста

Мне нужно быть уверенным, если какой-то пользователь существует в процессе работы контроллера, поэтому я не могу свести к минимуму текущую область для обратного вызова из-за большого количества одинаковых операций (например, связь с базой данных). Также я пытаюсь реализовать MVC-модель в своем проекте, поэтому хочу сохранить вспомогательные библиотеки (модули) в разделенных файлах. Вот почему я не хочу использовать какие-либо обратные вызовы или обещания - они будут многократно усложнять все, даже больше, чем дела.


Например, как я должен переписать быть выполнен успешно (если это на самом деле возможно) (вы можете игнорировать модель входа в систему и контроллер - они написаны, чтобы представлять сложность, если переписать этот код с помощью функции обратного вызова) следующий код:

user.js Lib

var db = require('./lib/db'); 

class User{ 
    constructor(id){ //get user by id 
     var result = db.models.user.findOne({_id: id}); //unsupported syntax in real :(
     if(!result || result._id != _id) 
      return false; 
     else{ 
      this.userInfo = result; 

      return result; 
     } 

    } 
} 

module.exports = User; 

входа модели

var user = require('./lib/user') 
var model = {}; 

model.checkUserLogged(function(req){ 
    if(!req.user.id || req.user.id == undefined) 
     return false; 

    if(!(this.user = new user(req.user.id))) 
     return false; 
    else 
     return true; 
}); 

module.exports = model; 

Контроллера Войти

var proxy = require('express').router(); 

proxy.all('/login', function(req, res){ 

    var model = require('./models/login'); 

    if(!model.checkUserLogged()){ 
     console.log('User is not logged in!'); 
     res.render('unlogged', model); 
    }else{ 
     console.log('User exists in database!'); 
     res.render('logged_in', model); 
    } 

}); 

Генератора функция/выходы, асинхронный/Await (es2017), и все так далее может быть использован только, чтобы решить эту проблему без вложенности.

Thx заранее.

+1

FYI, 'асинхронного/await' * не * части ES7 (ES2016). Это будет часть выпуска этого года, ES2017. –

+0

К сожалению. Thx для внимания :) Я исправил это в тексте вопроса. – impulsgraw

ответ

4

Есть две точки неправильно:

  • Mongoose методы нельзя назвать синхронно (Во всяком случае вызов к БД осуществляется синхронно не является хорошей идеей вообще).
  • В конструкторе класса ES6 не могут использоваться асинхронные/ждущие или генераторы. Это объясняется в этом answer.

Если вы не хотите, чтобы вложенный код был простым вариантом, можно было бы использовать async/await (в настоящее время доступный в Node.js с использованием флага, не рекомендуется для производства). Поскольку методы Mongoose возвращают обещания, их можно использовать с async/await.

Но, как я уже сказал, вы не можете сделать это в конструкторе, так что это должно быть где-то в другом месте.

В качестве примера вы могли бы сделать что-то вроде этого:

var proxy = require('express').router(); 
var db = require('./lib/db'); 

proxy.all('/login', async function(req, res){ 
    const result = await db.models.user.findOne({_id: req.user.id}).exec(); 
    if (!result) { 
     console.log('User is not logged in!'); 
     return res.render('unlogged'); 
    } 
    res.render('logged_in'); 
}); 
+0

Я могу использовать async/await (на данный момент у меня самый последний node.js, и я могу включить флаг '--harmony'). Хорошо, допустим, что этот код находится не в конструкторе, а в каком-то другом месте класса (например, в статической функции). Не могли бы вы привести пример того, как он будет переписан с использованием async/await (ES7)? – impulsgraw

+0

Я редактировал с примером. –

+0

если 'console.log' после' const result = ...'всегда возвращает' Promise {} '. Как я могу получить объект ответа вместо этого и * почему он все еще (к моменту ожидания завершен) в ожидании *? – impulsgraw

 Смежные вопросы

  • Нет связанных вопросов^_^