我有以下代码。
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对象。
请告诉我这有什么问题或建议任何其他方法来串行运行完整的代码。提前致谢。
答案 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方法的更多信息,请使用以下参考。