2016-10-24 7 views
0

最近、Node.jsとExpress.jsを試し始めました。私は、Mongo Dbからデータを取り込んで、サーバー側の例を使ってフロントエンドでJqueryデータ型を使って表示するマイクロアプリケーションを構築しています。Express Jsで定義した後でもJavascript変数が定義されていない、mongo db

私は必要なデータを取得することができます。しかし、アプリケーションを再起動するたびに、私はレコードの総数を得ることができず、変数は未定義となります。もう一度ページをリロードした後、私はカウントを取得します。どういうわけかjavascriptの新機能私は変数スコープや関数内の変数へのアクセスに関連していくつかの間違いを犯しているようです。だからそれを解決するために、私はエクスプレスjsアプリでコールバックを作成しました。機能のいくつかは機能していて、機能していないものもあります。ここでは、文書でのカウントをフェッチコードです:

//calling the functions here in the express js app 
app.get('/tweets/', function(req, res){ 
    var countWithoutFilters; 
    var countTwitter; 
    var page  = parseInt(req.query.start); 
    var limit  = parseInt(req.query.length); 
    var skip  = page; 
    var searchQuery = {}; 
    searchQuery = req.query.search.value; 
    searchQuery = (searchQuery == '' || searchQuery == undefined) ? {}:searchQuery; 
    var searchId = parseInt(searchQuery); 
    countNumberOfRowsInTweets(function(data){ 
     countWithoutFilters = data; 
    }); 
countNumberOfRowsInTweetsAfterFilters(searchQuery, function(data) { 
    countTwitter = data; 
}); 
    queryTweetsCollection(searchQuery, limit, skip, function(data){ 
     res.send({ 
      draw: req.query.draw, 
      recordsTotal: countTwitter, 
      recordsFiltered: countTwitter, 
      data: data, 
      page: parseInt(page) 
     }); 
    }); 

}); 

//function to get tweets from the document and count the length 
function countNumberOfRowsInTweets(callback) 
{ 
    db.collection('tweets').find().toArray(function(err, result){ 
     if(err) 
      return console.log(err); 
     callback(result.length); 
    }); 
} 
//count the items after applying filters 
function countNumberOfRowsInTweetsAfterFilters(searchQuery, callback) 
{ 
    console.log("Filtered row:"+searchQuery); 
    var searchId = parseInt(searchQuery); 
    db.collection('tweets').find({ $or: [{text: new RegExp(searchQuery, 'i')}, {id: searchId}]}).toArray(function(err, result){ 
     if(err) 
      return console.log(err); 
     callback(result.length); 
    }); 
} 

私は、他のアプローチを認識していないですが、私は、変数の巻き上げとクロージャのような概念を通過しようとしました。

可能であれば、正しい解決方法を教えてください。

おかげ

+0

ことを修正する必要があり

を完了するための機会を持って前に、あなたはそれらの変数を使用します*変数*は "undefined"になりますか? –

+0

countTwitterおよびcountWithoutFilters。 –

答えて

0

countNumberOfRowsInTweetscountNumberOfRowsInTweetsAfterFiltersあるあなたのカウント変数を充填する前に最初の

queryTweetsCollection(searchQuery, limit, skip, function(data){ 
    res.send({ 
     draw: req.query.draw, 
     recordsTotal: countTwitter, 
     recordsFiltered: countTwitter, 
     data: data, 
     page: parseInt(page) 
    }); 
}); 

を実行します、これは非同期でありますあなたはウィットを扱うコールバックを使用して、適切な時間 - しかし、countWithoutFiltersとを移入これらの関数を呼び出した後に - それらの非同期機能は、次のコードは、どの特定の

countNumberOfRowsInTweets(function(countWithoutFilters){ 
    countNumberOfRowsInTweetsAfterFilters(searchQuery, function(countTwitter){ 
     queryTweetsCollection(searchQuery, limit, skip, function(data){ 
      res.send({ 
       draw: req.query.draw, 
       recordsTotal: countTwitter, 
       recordsFiltered: countTwitter, 
       data: data, 
       page: parseInt(page) 
      }); 
     }); 
    }); 
}); 
+0

これは動作します。 Jaromandaありがとうございました。また、これを多くの詳細で理解するためのリソースを私に提供できますか?再度、感謝します。 –

+0

質問は、この質問は、開始点にする必要がありますの複製をマークされている - http://stackoverflow.com/questions/14220321/how-do-i-return-the-response-from-an-asynchronous-call –

+0

ありがとうそんなにJaromanda。私はこれを通過します。 –

0

JavaScriptの非同期

あるので、このコードは

countWithoutFilters = data; 
countTwitter = data; 
+0

はいNewbee Dev。あなたはこれで正しいです。 :) 助けてくれてありがとう。非常に高く評価。 –

関連する問題