node.js并表示将sqlite数据传递给我的一个视图

Car*_*ans 3 node.js express

在我的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})
})
Run Code Online (Sandbox Code Playgroud)

谁能告诉我这里我做错了什么.帖子数组似乎保持空无一物.

编辑 我正在按照一个教程解释说虽然插件有异步,但这个方法不是异步的

这是教程中的引用

尽管Node.js具有回调和异步特性,但这些事务将串行运行,允许我们创建,插入和查询语句优先级将在当前语句之前运行.但是,sqlite3提供了具有相同接口的"并行"包装器,但并行运行所有事务.这完全取决于你目前的情况.

Ale*_*yne 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})
    })
})
Run Code Online (Sandbox Code Playgroud)

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