我正在使用带有' http-methods'的陨石应用程序。来自大气和' node-sqlite3'来自npm的包裹。考虑流动的代码。
var results = null;
HTTP.methods({
'list': function(data) {
var sqlite3 = Npm.require('sqlite3').verbose();
var db = new sqlite3.Database(':memory:');
db.serialize(function() {
db.run("CREATE TABLE lorem (info TEXT)");
var stmt = db.prepare("INSERT INTO lorem VALUES (?)");
for (var i = 0; i < 10; i++) {
stmt.run("Ipsum " + i);
}
stmt.finalize();
db.all("SELECT rowid AS id, info FROM lorem", function(err, rows) {
console.log(rows);
results = rows;
});
});
console.log("Closing DB");
db.close();
console.log("Sending back response");
console.log(results);
return results;
}
});
这里使用domain / list调用上面的函数。我想返回resultSet作为对请求的响应。但不是它&#39; null&#39;已被退回。控制台的输出如下。
I20131229-23:50:20.092(1)? Closing DB
I20131229-23:50:20.113(1)? Sending back response
I20131229-23:50:20.117(1)? null
I20131229-23:50:20.172(1)? [ { id: 1, info: 'Ipsum 0' },
I20131229-23:50:20.181(1)? { id: 2, info: 'Ipsum 1' },
I20131229-23:50:20.182(1)? { id: 3, info: 'Ipsum 2' },
I20131229-23:50:20.183(1)? { id: 4, info: 'Ipsum 3' },
I20131229-23:50:20.199(1)? { id: 5, info: 'Ipsum 4' },
I20131229-23:50:20.199(1)? { id: 6, info: 'Ipsum 5' },
I20131229-23:50:20.199(1)? { id: 7, info: 'Ipsum 6' },
I20131229-23:50:20.202(1)? { id: 8, info: 'Ipsum 7' },
I20131229-23:50:20.202(1)? { id: 9, info: 'Ipsum 8' },
I20131229-23:50:20.203(1)? { id: 10, info: 'Ipsum 9' } ]
请建议适当的解决方案。
注意:给出的代码是实际代码的同义词。如果您想了解更多详情,请与我们联系。
答案 0 :(得分:0)
编辑:您正在db回调之前输出'results'。您只需在查询后立即关闭数据库连接。我可以猜测db模块在关闭之前完成查询,因为它最终会输出返回的行。
您需要关闭并返回回调。
db.all("SELECT rowid AS id, info FROM lorem", function(err, rows) {
console.log(rows);
results = rows;
db.close();
callback(results);
});
编辑:
这是一个更好的例子,使用回调代替return:
var results = null;
HTTP.methods({
'list': function(data, callback) {
var sqlite3 = Npm.require('sqlite3').verbose();
var db = new sqlite3.Database(':memory:');
db.serialize(function() {
db.run("CREATE TABLE lorem (info TEXT)");
var stmt = db.prepare("INSERT INTO lorem VALUES (?)");
for (var i = 0; i < 10; i++) {
stmt.run("Ipsum " + i);
}
stmt.finalize();
db.all("SELECT rowid AS id, info FROM lorem", function(err, rows) {
console.log(rows);
results = rows;
db.close();
// this returns the data in a callback function
callback(results);
});
});
// this will return 'results' before the query returns any results
// return results;
}
});
答案 1 :(得分:0)
你可以通过放置一个javascript的延迟方法来解决这个问题,该方法会暂停执行指定的时间。你可以停止执行几秒钟,你的问题就会解决。