首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >node-sqlite3,其中包含iojs、koa和yield

node-sqlite3,其中包含iojs、koa和yield
EN

Stack Overflow用户
提问于 2015-04-12 04:06:17
回答 3查看 1.5K关注 0票数 2

我是iojs的新手,我正在尝试用koa和node-sqlite3编写一个小型的web应用程序。

有一件事我不太明白,那就是如何在基于node-sqlite3回调的API上使用“head”语法。

我用谷歌搜索了一下,所有我找到的就是这篇stackoverflow帖子(synchronous sqlite transactions node),上面说这是可能的。

有没有人能给我一个更具体的例子?

提前感谢

EN

回答 3

Stack Overflow用户

发布于 2015-04-12 07:02:25

经过进一步的挖掘,我从stackoverflow帖子Koa.js request with promises is hanging中发现了一些提示。

诀窍是使用原生承诺。

下面的示例代码适用于iojs v1.6.4和Koa 0.19.0

代码语言:javascript
复制
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);
票数 2
EN

Stack Overflow用户

发布于 2015-09-23 00:55:25

这里有一个名为co-sqlite3的nodejs模块:https://www.npmjs.com/package/co-sqlite3

基于promise的节点-sqlite3,名为co-sqlite3,用于co或koa

安装

代码语言:javascript
复制
npm install co-sqlite3

使用

  1. 与公司合作

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);});

  • 处理koa

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);

  • just as a promise

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);});});

票数 2
EN

Stack Overflow用户

发布于 2015-04-15 03:30:02

虽然promises可以工作,但使用koa的主要优势是利用生成器( yield关键字)。要实现这一点,您正在使用的库需要准备好与生成器一起工作。

我知道您已经指定使用sqlite,但是有关使用yield访问数据库的示例,请参阅这个mongodb包co-monk是如何工作的:

代码语言:javascript
复制
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

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/29582476

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档