2017-01-11 4 views
1

私の初心者はexpressjsであり、コントローラの2つ以上のスキーマからデータを取得して渡す方法は不思議です。関数内の1つ以上のスキーマからデータを取得して渡す方法

ここでは、私はadd_new_blogページを開きたいとしているふりをして、以下はルータ です。

router.get('/add_new_blog', BlogController.index); 

さらにBlogController.indexでカテゴリとタグモデルを取得する必要があります。

const Category = require('models/categorySchema'); 
const Tag = require('models/tagSchema'); 

module.exports = { 

    index(req, res, next){ 

    Category.find({}); 
    Tag.find({}); 

    // how to find/retrieve data from both Schema then i pass them to Views. 


    res.render('/blog/blogForm'); 
    } 
} 

質問は、データを両方から取得してビューに渡すと、コーディングはどのように見えますか?

答えて

2

Promise.all()を使用して、2つのマングース呼び出しデータを取得してからレンダリングすることができます。

const categoryFind = Category.find({}).exec(); // exec() returns a Promise. 
const tagsFind = Tags.find({}).exec(); 

Promise.all(categoryFind, tagsFind).then((values) => { 
    res.render('/blog/blogForm', { categories: values[0], tags: values[1] }); 
}); 

コールバック内でレンダリングすることに注意してください。これは、mongoose呼び出しが非同期であるためです。そうしないと、クエリが完了する前にレンダリングされます。

Category.find({}, (err, catData) => { 
    Tags.find({}, (err, tagsData) => { 
    res.render('/blog/blogForm', { categories: catsData, tags: tagsData }); 
    } 
} 
+0

それが動作しますと同じです

!ありがとうございます。これはベストプラクティスかどうかですか? –

+0

@GoodDay最初のものです。 2番目の例はコールバック地獄につながる可能性があります。 http://callbackhell.com/ – zurfyx

関連する問題