我是iojs的新手,我正在尝试用koa和node-sqlite3编写一个小型的web应用程序。
有一件事我不太明白,那就是如何在基于node-sqlite3回调的API上使用“head”语法。
我用谷歌搜索了一下,所有我找到的就是这篇stackoverflow帖子(synchronous sqlite transactions node),上面说这是可能的。
有没有人能给我一个更具体的例子?
提前感谢
发布于 2015-04-12 07:02:25
经过进一步的挖掘,我从stackoverflow帖子Koa.js request with promises is hanging中发现了一些提示。
诀窍是使用原生承诺。
下面的示例代码适用于iojs v1.6.4和Koa 0.19.0
var koa = require('koa');
var app = koa();
var route = require('koa-route');
var sqlite3 = require('sqlite3').verbose();
var db = new sqlite3.Database(':memory:');
function *query() {
var promise = new Promise(function(resolve, reject) {
var result = [];
db.serialize(function() {
db.run("DROP TABLE IF EXISTS lorem");
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) {
resolve(rows);
});
});
});
return promise;
}
function *handler() {
this.body = yield query();
this.status = 200;
}
app.use(route.get('/list', handler));
app.listen(3000);发布于 2015-09-23 00:55:25
这里有一个名为co-sqlite3的nodejs模块:https://www.npmjs.com/package/co-sqlite3
基于promise的节点-sqlite3,名为co-sqlite3,用于co或koa
安装
npm install co-sqlite3使用
var co = require('co');var sqlite3 = require('co-sqlite3');co(function*() { //连接数据库var db = yield sqlite3('test.db');//创建一个表yield db.run('CREATE TABLE IF NOT EXISTS testtable (id INT NOT NULL)');var stmt = yield db.prepare('INSERT INSERT testtable(id) VALUES(?)');for(var i =0;i< 100;i++){ yield stmt.run(i);} stmt.finalize();var db.get=放弃行(‘SELECT* FROM testtable id <?ORDER BY ID DESC‘,50);console.log(行);// {id: 49} var rows =输出db.all('SELECT * FROM testtable');console.log(rows.length);}).catch(function(err) { console.log(err.stack);});
var koa = require('koa');var sqlite3 = require('co-sqlite3');var app = koa();app.use(function*( next ){ this.db =next sqlite3('test.db');next;});app.use(function* (){ this.body =next this.db.get('SELECT * FROM testtable id <?ORDER BY ID DESC‘,50);}) app.listen(3000);
var sqlite3 = require('co-sqlite3');sqlite3('test.db').then(function(db){ db.get('SELECT * FROM testtable ID <?ORDER BY id DESC‘,50) .then(function(row){ console.log(row);});});
发布于 2015-04-15 03:30:02
虽然promises可以工作,但使用koa的主要优势是利用生成器( yield关键字)。要实现这一点,您正在使用的库需要准备好与生成器一起工作。
我知道您已经指定使用sqlite,但是有关使用yield访问数据库的示例,请参阅这个mongodb包co-monk是如何工作的:
yield users.insert({ name: 'Tobi', species: 'ferret' });
var res = yield users.findOne({ name: 'Tobi' });
res.name.should.equal('Tobi');虽然您可以自己使用co package包装node-sqlite3,但如果您刚开始使用,您可能会发现使用现有的co-based库会更容易一些。
MySQL似乎也有一个生成器就绪的包,尽管我找不到任何与sqlite等效的包。
如果这有帮助,这里有一个更完整的博客帖子,其中包含使用co-monk的示例:http://www.marcusoft.net/2014/04/koaExamples.html
https://stackoverflow.com/questions/29582476
复制相似问题