2017-01-16 6 views
1

それは関数コンテキスト内db.model.find()クエリを処理し、マングースライブラリとコールバックと約束を使用してせずに結果を取得することは可能ですか?同期マングース要求

コントローラの実行中のユーザーがいる場合は、同じ操作(たとえば、データベースとの通信)が大量であるため、コールバックに現在のスコープを最小化できません。また、私のプロジェクトでMVCモデルを実現しようとしているので、ヘルパーライブラリ(モジュール)を別々のファイルに保存したいと思っています。だからこそ、私はコールバックや約束を使うことを望まないのです。


例えば、どのように私は(あなたがログインモデルとコントローラを無視することができます - コールバックを使用してそのコードを書き直す場合、彼らは煩雑を表現するために書かれている)(それが実際に可能かどう)が正常に実行されるように、次のコードを書き換える必要があります。

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; 
libに

user.jsの

ログインコントローラ

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

を、 '非同期/ await'は* * ES7(ES2016)の一部ではありません。今年のリリース、ES2017の一部となります。 –

+0

注意のためのThx:私は質問のテキストでそれを修正しました。 – impulsgraw

答えて

4

2つの点が間違ってあります

  • マングース方法は、(とにかく同期的に行わDBへの呼び出しがすべてでは良いアイデアではありません)同期的に呼び出すことはできません。
  • async/awaitもジェネレータも、ES6クラスのコンストラクタで使用できません。これはanswerで説明されています。

ネストしたコードを簡単に使用したくない場合は、async/await(現在はNode.jsのフラグを使用していますが、本番では使用できません)を使用することができます。 Mongooseメソッドは約束を返すので、async/awaitで使用できます。

しかし、私が言ったように、あなたはコンストラクタでそれを行うことはできないので、それは別の場所になければなりません。

例として、あなたはこのような何か行うことができます:FYI

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

'const result = ...の後の' console.log'には'それは常に' Promise {} 'を返します。代わりに応答オブジェクトを取得するにはどうしたらいいのですか?*待ち状態になっているのはなぜですか? – impulsgraw

関連する問題