Рендеринг результатов двух разных запросов одновременно в Node.js res.render - PullRequest
0 голосов
/ 12 ноября 2018

Я пытаюсь показать результаты двух SQL-запросов на одной странице.Мой код находится в блоке module.exports, а все приложение написано в Node.js Express.Это возвращает ошибку «Не удается прочитать свойство 'длина' из неопределенного".

var message = "some random text";
var res_points, res_types;
    db.query(query, (err, result) => {
        if (err) {
            res.redirect('/');
        }
        res_points= result;
    });
    db.query(query2, (err, result) => {
        if(err) {
            res.redirect('/');
        }
        res_types = result;
    });

    res.render('index.ejs', {
        title: message,
        ,points: res_points
        ,types: res_types
    });

Когда я делаю это так, это работает:

db.query(query, (err, result) => {
        if (err) {
            res.redirect('/');
        }
        res.render('index.ejs', {
            title: message,
            points: result
        });
    });

Что я делаю неправильно?Или лучше сказать, как я могу передать результаты этих двух запросов в функцию рендеринга?

Ответы [ 2 ]

0 голосов
/ 12 ноября 2018

Самый чистый подход здесь - использовать Обещания & Promise.all.Для этого вам нужно будет обернуть db.query в Promise.

// You can use Util.promisify too
const queryWrapper = (statement) => {

    return new Promise((resolve, reject) => {

        db.query(statement, (err, result) => {
            if(err)
                return reject(err);

            resolve(result);
        });

    });

};


app.get('/some-route', (req, res, next) => {
    const message = "some random text";

    Promise.all([
        queryWrapper(query),
        queryWrapper(query2)
    ])
    .then(([points, types]) => {

        res.render('index.ejs', {
            title: message,
            points,
            types
        });
    })
    .catch(err => {
        console.error(err);
        res.redirect('/');
    })
});

Примечание : если вы используете MySQL, пакет mysql2 предлагает поддержку обещаний, поэтомуВы можете избежать оболочки Promise.

0 голосов
/ 12 ноября 2018

Я нашел обходной путь, подобный этому, но я действительно не думаю, что это единственный, правильный и элегантный способ сделать это:

    let res_points, res_types;
    db.query(query, (err, result) => {
        if (err) {
            res.redirect('/');
        }
        db.query(query2, (err2, result2) => {
            if(err2) {
                res.redirect('/');
            }
            res.render('index.ejs', {
                title: "Welcome to Hamburg Map | View Points"
                ,points: result
                ,types:result2
            });
        });
    });
...