2016-12-14 7 views
0

На моем app.get в моем server.js я возвращаю набор данных из mongo db, а затем передаю свою страницу при передаче данных на нее.res.render ТОЛЬКО после завершения нескольких запросов данных

, как показано ниже:

//page load 
app.get('/', (req, res) => { 

    //find all data in test table 
    var articles; 
    db.collection('test').find().toArray((err, result) => { 
     if (err) return console.log(err) 
     articles = result 

      // renders index.ejs and passes result to quotes 
     res.render('./pages/index.ejs', { 
      quotes: articles 
     }) 
    }) 
}) 

Я хочу, чтобы иметь возможность поставить несколько БД запросы, а затем передать несколько переменных данных на мой визуализации, моя проблема в том, что, когда я кладу res.render вне запроса db, он пытается отобразить до того, как db получит свой набор данных.

посмотреть, что я пытался ниже:

//page load 
app.get('/', (req, res) => { 

    //find all data in test table 
    var articles; 
    db.collection('test').find().toArray((err, result) => { 
     if (err) return console.log(err) 
     articles = result 
    }) 

     // renders index.ejs and passes result to quotes 
     res.render('./pages/index.ejs', { 
      quotes: articles 
     }) 
}) 

мой вопрос:

Как я мог убедиться, что рендер происходит ТОЛЬКО после моих БД запросов закончились и возвратил данные в переменную?


В конце концов, я хотел бы быть в состоянии сделать что-то вроде этого:

//page load 
app.get('/', (req, res) => { 

    //find all data in table 1 
    var AAA; 
    db.collection('test1').find().toArray((err, result) => { 
     if (err) return console.log(err) 
     AAA = result 
    }) 

    //find all data in table 2 
    var BBB; 
    db.collection('test2').find().toArray((err, result) => { 
     if (err) return console.log(err) 
     BBB = result 
    }) 

    //find all data in table 3 
    var CCC; 
    db.collection('test3').find().toArray((err, result) => { 
     if (err) return console.log(err) 
     CCC = result 
    }) 

     // renders index.ejs and passes result to quotes 
     res.render('./pages/index.ejs', { 
      quotes: AAA, 
      quotes2: BBB, 
      quotes3: CCC 
     }) 
}) 

Любая помощь или совет по этому вопросу ценится. Заранее спасибо.

+0

Если вы используете собственный клиент mongodb, то не проходите обратные вызовы, поэтому он возвращает обещание, а затем просто используйте 'then', выполняйте запрос, присваивайте результат внешней переменной, затем другой' then', выполняете запрос и т. д. – jstice4all

+0

первый запрос был бы идеальным, но я хотел бы иметь возможность делать несколько запросов, а затем передавать все результаты в рендеринг в конце, см. Edit. @ jstice4all –

+0

Я отредактировал свой комментарий. – jstice4all

ответ

2

Попробуйте этот код, он не проверял, но я думаю, что это должно работать:

app.get('/', (req, res) => { 

    var list = {}; 

    db.collection('test').find().toArray().then(result => { 
     list.result = result; 
    }).then(() => { 
     return Promise.resolve(db.collection('foo').find().toArray()); 
    }).then(result2 => { 
     list.result2 = result2; 
    }).then(() => { 
     return Promise.resolve(db.collection('bar').find().toArray()); 
    }).then(result3 => { 
     list.result3 = result3; 
    }).then(() => { 
     res.render('./pages/index.ejs', list); 
    }).catch(e => { 
     console.error(e); 
    }); 

}); 

Update: мы можем использовать асинхронной/Await для любого метода, который возвращает Promise так что код будет чище:

// you can use express-async-errors package to make routes async 
app.get('/', async(req, res) => { 
    let list = []; 
    list.result = await db.collection('test').find().toArray(); 
    list.result2 = await db.collection('foo').find().toArray(); 
    list.result3 = await db.collection('bar').find().toArray(); 
    res.render('./pages/index.ejs', list); 
}); 
+0

Я обновил ответ. Проверьте, работает ли это. – jstice4all

1

Для этого вы можете использовать модуль async. Используйте функции async.parallel для функций, которые являются независимыми друг от друга и используют async.series для зависимых процессов. Проверьте async.

Смежные вопросы