4

在我的 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 提供了一个具有相同接口的“并行”包装器,但并行运行所有事务。这一切都取决于你目前的情况。

4

1 回答 1

13

调用可能是db异步的。这意味着您在他们返回数据之前进行渲染。

您需要弄清楚如何从查询中获取一个回调,并在该回调中呈现您的模板。

看起来您希望将第二个complete回调传递给db.each()(感谢Jonathan Lonowski的提示!)

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

这个想法是在任何异步代码的最后一个回调中呈现,这样你就拥有了你需要的一切。


于 2013-07-30T18:42:05.890 回答