在meteor node-sqlite3中系列执行db.all函数

时间:2013-12-22 23:49:48

标签: node.js sqlite meteor

我有以下代码。

  sqlite3 = Npm.require("sqlite3").verbose()
  db = new sqlite3.Database("sqlSample.db")

  console.log "DB connection made"

  db.serialize ->
    db.run "CREATE TABLE CarDetails(make TEXT)"

    stmt = db.prepare("INSERT INTO CarDetails VALUES (?)")
    i = 0
    while i < 10
      stmt.run "Item #" + i
      i++
    stmt.finalize()

    console.log "Values inserted into DB"

    db.all "SELECT rowid AS id, make FROM CarDetails", (err, rows) ->
      console.log rows

  console.log "Closing the DB connection"

  db.close()

在meteor的服务器启动中执行此代码时控制台中的输出是

DB connection made
Values inserted into DB
Closing the DB connection
[ { id: 1, make: 'Item #0' },
   { id: 2, make: 'Item #1' },
   { id: 3, make: 'Item #2' },
   { id: 4, make: 'Item #3' },
   { id: 5, make: 'Item #4' },
   { id: 6, make: 'Item #5' },
   { id: 7, make: 'Item #6' },
   { id: 8, make: 'Item #7' },
   { id: 9, make: 'Item #8' },
   { id: 10, make: 'Item #9' } ]

这里打印查询结果之前打印'关闭数据库连接'(我知道原因)。我想知道的是如何修改代码,以便在打印行值后才打印“关闭数据库连接”。

我尝试使用

rows = db.all "SELECT rowid AS id, make FROM CarDetails"
console.log rows

但输出结果是

DB connection made
Values inserted into DB
{ open: false,
 filename: 'sqlSample.db',
 mode: 65542 }
Closing the DB connection

这里以所需的顺序执行但不是结果集我在行中得到了一些其他的json对象。

请告诉我这有什么问题或建议任何其他方法来串行运行完整的代码。提前致谢。

1 个答案:

答案 0 :(得分:0)

使用Meteor._wrapAsync以串行方式执行db.all。请注意,这违反了异步非阻塞执行的'​​node-sqlite3'目的。

dbAllSync = Meteor._wrapAsync(db.all.bind(db))
rows = dbAllSync("SELECT rowid AS id, make FROM CarDetails")
console.log rows

将异步函数名称作为_wrapAsync方法的参数传递。如果必须在某个对象的上下文中执行该函数,请将“.bind”添加到方法名称中,并将该对象指定为其参数。这里'all'方法必须在'db'对象的上下文中调用。 dbAllSync的类型是Function。使用它通过向其传递参数来同步执行异步“db.all”。

如果您想了解有关_wrapAsync方法的更多信息,请使用以下参考。