在Node.js res.render中同时渲染两个不同查询的结果

时间:2018-11-12 19:45:03

标签: javascript html node.js node-modules http-get

我试图在一页中显示两个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函数?

2 个答案:

答案 0 :(得分:1)

这里最干净的方法是使用 Promises 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支持,因此可以避免使用Promise包装器。

答案 1 :(得分:0)

我发现了这样的解决方法,但我真的不认为这是唯一,可行且优雅的方法:

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