node.js和express将sqlite数据传递给我的一个视图
在my app.js中,我尝试从sqlite数据库检索数据并将其传递给我的一个视图:node.js和express将sqlite数据传递给我的一个视图,node.js,express,Node.js,Express,在my app.js中,我尝试从sqlite数据库检索数据并将其传递给我的一个视图: app.get("/dynamic", function(req, res) { var db = new sqlite3.Database(mainDatabase) var posts = [] db.serialize(function() { db.each("SELECT * FROM blog_posts", function(err, row) {
app.get("/dynamic", function(req, res) {
var db = new sqlite3.Database(mainDatabase)
var posts = []
db.serialize(function() {
db.each("SELECT * FROM blog_posts", function(err, row) {
posts.push({title: row.post_title, date: row.post_date, text: row.post_text})
})
})
res.render("dynamic", {title: "Dynamic", posts: posts})
})
有人能告诉我我做错了什么吗。无论发生什么,posts数组似乎都是空的
编辑
我遵循了一个解释,虽然插件有异步,但这个方法不是异步的
以下是本教程的一段引文
尽管Node.js具有回调和异步特性,但是
事务将按系列运行,允许我们创建、插入和
知道先前语句将在当前语句之前运行的查询
做然而,sqlite3提供了一个具有相同特性的“并行”包装器
接口,但并行运行所有事务。就这些
取决于你目前的情况
db
调用可能是异步的。这意味着您要在它们返回数据之前进行渲染
您需要弄清楚如何从查询中获取一个回调,并在该回调中呈现模板
看起来您需要将第二次完整的回调传递给(谢谢,谢谢提示!)
其思想是在任何异步代码的最后一次回调中进行渲染,这样您就拥有了所需的一切
我起初认为这可能与它的异步性有关,而且很可能是这样。我只是认为这会起作用,因为执行console.log(row.post\u title+“”+row.post\u text+“”+row.post\u date)
将在console@CarsonEvans是的,但是console.log()
调用会在页面呈现之后发生。在您的原始代码中,调用了res.render()
,然后db查询返回一个结果。非常感谢!!成功了。我必须记住这一点,因为我以后会做更多的事情。两件事:1-为什么要使用序列化?它仅适用于更新/插入。2-使用all方法,而不是每个方法。它返回一个包含所有行的数组,为您省去了麻烦。在我看来,应该使用某种异步渲染来优化这一点,但这是另一回事。关于编辑:serialize!=同步
serialize
只将查询放入队列中,并延迟每个查询的开始,直到上一个查询完成。因此,您可以指望它们是按顺序发生的,而不是并行/一次全部发生,但每个查询仍然异步执行。感谢您澄清这一点。
var posts = [];
db.serialize(function() {
db.each("SELECT * FROM blog_posts", function(err, row) {
posts.push({title: row.post_title, date: row.post_date, text: row.post_text})
}, function() {
// All done fetching records, render response
res.render("dynamic", {title: "Dynamic", posts: posts})
})
})