Это ваш код, исправленный, оптимизированный и использующий последние спецификации скрипта ECMA, ошибка в том, что, как говорится в другом комментарии, вы не ожидаете результата обещаний в вашей декларации "new Promise ..". Не забывайте использовать try / catch внутри функций asyn c, если у вас нет верхнего обработчика ошибок.
Оптимизация выполняется с помощью первых переменных снимка, таким образом вы получаете данные параллельно, а не последовательно.
indexRouter.get('/dashboard', checkSignIn, async (request, response) => {
try {
let details = [];
const userId = request.session.userId
let [snapshot1, snapshot2] = await Promise.all([db.doc('users/accounts').get(), await db.doc(`users/${userId}`).get()])
let sites = snapshot1.data()['sites']
var linkedSites = snapshot2.data()['linked sites'];
await Promise.all(
linkedSites.map((site) =>
db.doc(`users/${userId}`).collection(site).get()
.then((snapshot) => {
snapshot.forEach((doc) => {
emailId = doc.id
keys = doc.data()['keys']
var passwordEncrypt = doc.data()['password']
password = cryptoJS
details.push({ site: { 'email': emailId, 'password': password, 'keys': keys } })
})
})
)
)
response.render('dashboard', { 'details': details, 'linkedSites': linkedSites, 'sites': sites })
} catch (e) {
//Render error you want
}})
connectedSites.map .... возвращает массив Обещаний, которые в конце обернуты в Promise.all, и Promise.all ждут, пока все обещания не будут выполнены, или одно из них будет отклонено в этом последнем случае, ваш код идет поймать без достижения линии response.render внутри try. Вы можете избежать этого, ловя локально ошибку каждого обещания на карте, используя
.then((snapshot) => {
...
}).catch(e=> { /*Do something with the rror*/})