在 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,
});
});
});
});
我正在尝试 运行 三个 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,
});
});
});
});