node.js和express将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) {

在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) {
            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})
    })
})