2016-05-22 5 views
1

私はExpressとHandlebarsを使用して、ユーザーが設定してデータベースに格納した値を表示しています。Javascriptでのデータベースクエリの処理

ハンドルバーは、値「{{userMotto}}」を表示するように設定されています。 Expressは、次のことを行います。

function isUserAuthenticated(req, res, next) { 
    if (!req.user) { 
     res.render('index', { 
      user: req.user 
     }); 
    } else { 
     currentUser = req.user.username; 
     userMottoCaught = queryDatabase("motto", currentUser); 
     next(); 
    } 
} 

私は、それがデータベースに見つかったものは何でも「userMottoCaught」の値を設定します。クエリ自体はこれです:

function queryDatabase(dbCollection, dbUID) { 
    this.dbCollection = dbCollection; 
    this.dbUID = dbUID; 

    return MongoClient.connectAsync(hiddenkeys.mongodbUri) 
     .then(function(db) { 
      return db.collection(dbCollection).findOneAsync({ 
       _id: dbUID 
      }); 
     }) 
     .then(function(item) { 
      console.log("Found: "); 
      console.log(item); 
      return dbQueryResult; 
     }) 
     .catch(function(err) { 
      //err 
     }); 
} 

問題は、私は私の人生のためにdbQueryResultを取得し、それがqueryDatabase自体を関数に戻ることができないということです。おそらく、主関数の代わりに今すぐサブ関数に返されていると思われます。私はこれを簡単に解決することができると非常に思っていますが、私はこれを修正する方法を失うだけです。私はここでBluebirdを使ってこれを約束で解決できるかどうかを確認していますが、これが適切なルートであるかどうかはわかりません。私もコールバックを調べましたが、私の人生では、いずれかの概念をコードに適用して問題を解決する方法を理解できません。

router.get('/', isUserAuthenticated, function(req, res) { 
    res.render('dashboard', { 
     user: req.user, 
     userMotto: userMottoCaught 
    }); 
}); 

現在、このページの利回り:「座右の銘:[オブジェクトの約束]」、私は戻っていないので、その後、私は、私はページ上にレンダリングするために、これを行うページをレンダリングするときに

メイン関数の適切な値。

賢明な言葉がある人はいますか?

乾杯、

ディーン

答えて

0

は、私は、これは小さなもので動作しますが、

function queryDatabase(dbCollection, dbUID,cb) { 
    this.dbCollection = dbCollection; 
    this.dbUID = dbUID; 

    return MongoClient.connectAsync(hiddenkeys.mongodbUri) 
     .then(function(db) { 
      return db.collection(dbCollection).findOneAsync({ 
       _id: dbUID 
      }); 
     }) 
     .then(function(item) { 
      console.log("Found: "); 
      console.log(item); 
      dbQueryResult = JSON.stringify(item.motto); 
      cb(null,dbQueryResult) 
     }) 
     .catch(function(err) { 
      //err 
      cb(err); 
     }); 
} 
+0

のようになります。ここでは、コールバック

function isUserAuthenticated(req, res, next) { if (!req.user) { res.render('index', { user: req.user }); } else { currentUser = req.user.username; userMottoCaught = queryDatabase("motto", currentUser,function(err,data){ userMottoCaught = data next(); }); } } 

とqueryDatabaseの定義を作成する必要があると思います変更:私はまだdbQueryResultが "アイテム"と同じであることを定義しなければなりません。しかし、私が "next();"他のクエリを追加する場合は、userMottoCaughtセクションの引数を使用しますか?私が1行下に移動してelseフィールド自体に移動すると、それは失敗し、ページに "[object promise]"と表示されます。 ありがとうございました:) –