在 nodejs 中,如何 运行 SQL 查询以便在呈现页面之前准备好数据?

In nodejs, how to run SQL queries so data is ready before page is rendered?

我正在尝试 运行 三个 SQL 查询来获取数据以推送到浏览器。我是 nodejs 和 Express 的新手(不到一周),所以我可能没有关于如何处理此类问题的一些基本概念。解决方案可能非常基本。

无论如何,我将分享我的代码,描述我想要发生的事情,然后描述实际发生的事情,并附上一些我认为我哪里出错的注释。

app.get("/", function(request, response) {
    var rock_query = "SELECT COUNT(*) AS number FROM Votes WHERE shape_id = 1;";
    var paper_query = "SELECT COUNT(*) AS number FROM Votes WHERE shape_id = 2;";
    var scissors_query = "SELECT COUNT(*) AS number FROM Votes WHERE shape_id = 3;";
    pool.query(rock_query, function(err, res) {
        if(err) {
            return console.error('error running query', err);
        }
        rock = res.rows[0].number;
        console.log("Rock votes: " + rock);
    });
    pool.query(paper_query, function(err, res) {
        if(err) {
            return console.error('error running query', err);
        }
        paper = res.rows[0].number;
        console.log("Paper votes: " + paper);
    });
    pool.query(scissors_query, function(err, res) {
        if(err) {
            return console.error('error running query', err);
        }
        scissors = res.rows[0].number;
        console.log("Scissors votes: " + scissors);
    });
    response.render("home", {
        rock: rock,
        paper: paper,
        scissors: scissors,
    });
});

我正在努力做到这一点,当我访问主页时,查询 运行 计算每个形状的投票数,将每个形状的计数写入控制台,推送数据当页面呈现时,它会显示投票数。

当我转到主页时,它会在页面呈现时为每个形状显示全零。控制台显示每个形状的计票数。我发现因为 nodejs 运行s 中的代码是异步的,所以页面在查询完成之前呈现。

我不确定应该如何重写上面的代码以在呈现页面之前完成查询。帮忙?

使用pg-promise,可以按如下方式完成:

app.get("/", (request, response) => {
    db.task(t => {
        var query = 'SELECT count(*) FROM Votes WHERE shape_id = ';
        return t.batch([
            t.one(query, 1, a => +a.count),
            t.one(query, 2, a => +a.count),
            t.one(query, 3, a => +a.count)
        ]);
    })
        .then(data => {
            response.render('home', {
                rock: data[0],
                paper: data[1],
                scissors: data[2],
            });
        })
        .catch(error => {
            // handle the error here
        });
});

有关更多示例,请参阅 Michael Herman 的 Designing a RESTful API With Node and Postgres

您可以使用此代码:

pool.query(rock_query, function(err, res) {
if(err) {
     console.error('error running query', err);
}
rock = res.rows[0].number;
console.log("Rock votes: " + rock);
pool.query(paper_query, function(err, res) {
    if(err) {
        console.error('error running query', err);
    }
    paper = res.rows[0].number;
    console.log("Paper votes: " + paper);
    pool.query(scissors_query, function(err, res) {
        if(err) {
            console.error('error running query', err);
        }
        scissors = res.rows[0].number;
        console.log("Scissors votes: " + scissors);
        response.render("home", {
            rock: rock,
            paper: paper,
            scissors: scissors,
        });
    });
});

});