2016-03-24 2 views
0

こんにちは、私はmongooseのfindから返された要素にアクセスしようとしていて、非同期とコールバックの状況にいくつかの問題があります。返されたmongooseのオブジェクトを取得します。

ここでは、理解を深めるためのコードを示します。

function retrieveBudgets(email, callback) { 
     models.User.find({email: email},{budget:true}, function(err,budgets) { 
     if (err) { 
      callback(err, null); 
     } else { 
      callback(null, budgets); 
     } 
    }); 
}; 

retrieveBudgets(user.email, function(err, budgets) { 
    if (err) { 
     console.log(err); 
    } 
    budgets.forEach(function(budget){ 
     console.log(JSON.stringify(budget, null, 4)); 
    }); 

}); 

だから、この行console.log(JSON.stringify(budget, null, 4));は正しく動作し、JSON形式で画面にオブジェクトを印刷するが、どのように私はここからオブジェクトの配列にそれぞれを保存しますか?この同じ行で配列にプッシュしようとすると、エラーが発生します。

私は似たような質問をいくつか見てきましたが、私はそれらといっしょに前進していません。 編集:____________________________________________________ 私はそれを働かせるために少しハックをしました。私はres.renderを動かしました。ページをレンダリングするのはコールバックと同時に行われましたが、これは正しい解決策であると考えています。

var user=req.session.user; 
    res.locals.budgets=[]; 

    function retrieveBudgets(email, callback) { 
     models.User.find({email: email},{budget:true}, function(err, budgets) { 
      if (err) { 
       callback(err, null); 
      } else { 
       callback(null, budgets); 
      } 
     }); 
    }; 

    retrieveBudgets(user.email, function(err, budgets) { 
     if (err) { 
      console.log(err); 
     } 
      res.locals.budgets = budgets.map((function(b){ return b; }); 

     res.render('budget/budget.jade',{ csrfToken: req.csrfToken() }); 
    }); 

これは私が地元の人たちから予算にアクセスできるようにするため、これについてのフィードバックはすばらしいことでしょう。

答えて

2

retrieveBudgets呼び出しから取得する戻り値は、すでに配列です。

これは、配列のメソッドであるbudgets.forEachへの呼び出しによって証明されます。

アイテムから新しい配列を作成する特定の必要がありますか?それは容易に行うことができる。

var myNewArray = budgets.map((function(b){ return b; });

コードのこの1行予算項目のそれぞれを含む新しい配列に元の予算配列をmapう。

あなたは正確に

私は本当にに何をしたいのか

以下のコメントからの更新は、外部の予算を使っているが何をする必要があるかに応じて、新しい配列を作成する他の方法が存在しますクエリの結果をビューに渡すことができます。

この場合、コールバック内からビューをレンダリングし、ビューに予算を渡す必要があります。


router.get("/foo", function(req, res, next){ 

    retrieveBudgets(user.email, function(err, budgets) { 
    if (err) { return next(err); } 

    res.render('budget/budget.jade',{ 
     budgets: budgets, 
     csrfToken: req.csrfToken() 
    }); 
    }); 

}); 

これは、この作業を行うための唯一の正しい方法です。

コールバックが完了するのを待たずに実行しようとした場合、budgets配列にはデータがありません。したがって、コールバックが実行されるのを待ってから、ビューに渡されたbudgets(またはbudgetなど)を使用してビューをレンダリングする必要があります。

(これには約束を使用していますが、これを処理する簡単な方法としてコールバックがあります。)

+0

私はそれを持っていると思っていましたが、myNewArrayを外部で使用しようとすると、スコープ内で宣言しても、私が本当にやりたいことはクエリの外で予算を使用するので、ビュー – homerjay

+0

はあなたのコメントに基づいて私の答えを更新しました –

+0

最終的にそこに着いてくれてありがとう – homerjay

1
あなたのヒスイのファイルにオブジェクトを渡しているここでラインを回し

res.render('budget/budget.jade',{ 
    csrfToken: req.csrfToken(), 
    budgets: budgets.map(function(b) {return b;}) 
}); 

これはあなたのヒスイのファイルへbudgetsを渡します、そして、あなたがそこにアクセスすることができるはずです。

関連する問題