簡體   English   中英

在Node.js res.render中同時渲染兩個不同查詢的結果

[英]Render results of two different queries at the same time in Node.js res.render

我試圖在一頁中顯示兩個SQL查詢的結果。 我的代碼在module.exports塊中,整個應用程序用Node.js Express編寫。 這將返回錯誤“無法讀取未定義的屬性'length'”。

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
        });
    });

我究竟做錯了什么? 或者更好的說,如何將這兩個查詢的結果傳遞給render函數?

我發現了這樣的解決方法,但我真的不認為這是唯一,可行且優雅的方法:

    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
            });
        });
    });

這里最干凈的方法是使用PromisesPromise.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支持,因此您可以避免Promise包裝器。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM