Я хочу отобразить страницу с вложениями, а также все электронные письма, на которые подписаны эти вложения. Но письма отображаются некорректно. Иногда в это поле вставляется электронное письмо, которое должно быть в следующем поле. И где-то поле остается пустым, когда должно быть письмо (это письмо находится в другом поле). Тогда я решил заменить forEach на for await. Но ситуация не изменилась. В чем проблема?

router.get('/', auth, async (req, res) => {
    try {
        await Attachment.find(async (err, attachments) => {
            let html_table = ""
            for await (const attachment of attachments) {
                html_table += "<tr>"
                html_table += "<td>"
                html_table += attachment.file_name
                html_table += "</td>"
                html_table += "<td>"
                console.log(attachment.id)
                await User.find({
                    attachments: attachment.id
                }, async (err, users) => {
                    for await (const user of users){
                        html_table += user.email + "<br />"
                        console.log(user.email)
                    }
                })
                html_table += "</td>"
                html_table += "</tr>"
            }
            res.json(html_table)
        })
    } catch (e) {
        res.status(500).json({ message: e.message })
    }
})
1
Vladislav Sokolov 27 Ноя 2021 в 17:07

1 ответ

Лучший ответ

Вы смешиваете обещания с обратными вызовами - res.json будет выполнен до завершения внутреннего обратного вызова для User.find. Вероятно, вы ищете что-то вроде:

router.get('/', auth, async (req, res) => {
    try {
        const attachments = await Attachment.find();
        let html_table = ""
        for (const attachment of attachments) {
                html_table += "<tr>"
                html_table += "<td>"
                html_table += attachment.file_name
                html_table += "</td>"
                html_table += "<td>"
                console.log(attachment.id)
                const users = await User.find({
                    attachments: attachment.id
                });
                for (const user of users){
                      html_table += user.email + "<br />"
                      console.log(user.email)
                }                    
                html_table += "</td>"
                html_table += "</tr>"
       }
       res.json(html_table);
    } catch (e) {
        res.status(500).json({ message: e.message })
    }
})
1
eol 27 Ноя 2021 в 17:27
1
У меня это работает. Спасибо
 – 
Vladislav Sokolov
27 Ноя 2021 в 17:32