【问题标题】:node-sqlite3 with iojs, koa and yield带有 iojs、koa 和 yield 的 node-sqlite3
【发布时间】:2015-06-17 09:57:15
【问题描述】:

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

我无法完全理解的一件事是如何在基于 node-sqlite3 回调的 API 上使用“yield”语法。

我用谷歌搜索了一下,发现的只是这个 stackoverflow 帖子 (synchronous sqlite transactions node),上面说这是可能的。

谁能给我指点更具体的例子?

提前致谢

【问题讨论】:

    标签: node.js sqlite koa


    【解决方案1】:

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

    基于承诺的 node-sqlite3 命名为 co-sqlite3 用于 co 或 koa

    正在安装

    npm install co-sqlite3
    

    用法

    1. 与同事合作

      var co = require('co');
      var sqlite3 = require('co-sqlite3');
      
      co(function*() {
      
      //connect a database
      
      var db = yield sqlite3('test.db');
      
      // create a table 
      yield db.run('CREATE TABLE IF NOT EXISTS testtable (id INT NOT NULL)');
      
      var stmt = yield db.prepare('INSERT INTO testtable(id) VALUES( ? )');
      
      for(var i =0 ; i < 100 ; i++){
          yield stmt.run(i);
      }
      
      stmt.finalize();
      
      var row = yield db.get('SELECT * FROM testtable WHERE id < ? ORDER BY ID DESC ' ,[50]); 
      console.log(row); // {id: 49}
      
      var rows = yield db.all('SELECT * FROM testtable');
      console.log(rows.length);
      
      
       }).catch(function(err) {
      
      console.log(err.stack);
      
      });
      
    2. 使用 koa

      var koa = require('koa');
      var sqlite3 = require('co-sqlite3');
      
      var app = koa();
      
      app.use(function*(next){
          this.db = yield sqlite3('test.db');
          yield next ;
      });
      
      
      app.use(function* (){
          this.body = yield this.db.get('SELECT * FROM testtable WHERE id < ? ORDER BY ID DESC ' ,[50]);
      })
      
      app.listen(3000);
      
    3. 就像一个承诺

      var sqlite3 = require('co-sqlite3');
      
      
      sqlite3('test.db').then(function(db){
          db.get('SELECT * FROM testtable WHERE id < ? ORDER BY ID DESC ' ,[50])
            .then(function(row){
            console.log(row);
          });
      });
      

    【讨论】:

      【解决方案2】:

      虽然 promise 有效,但使用 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 的库之一会更容易。

      MySQL 似乎也有一个生成器就绪包,但我找不到任何与 sqlite 等效的包。

      如果有帮助,这里有一篇更完整的博客文章,其中包含使用 co-monk 的示例:http://www.marcusoft.net/2014/04/koaExamples.html

      【讨论】:

        【解决方案3】:

        经过一番挖掘,我从stackoverflow帖子Koa.js request with promises is hanging中找到了一些提示。

        诀窍是使用原生 Promises。

        下面的示例代码适用于 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);
        

        【讨论】:

        • 这也适用于 NodeJS v0.12.0 和 --harmony 标志。
        猜你喜欢
        • 2016-10-18
        • 1970-01-01
        • 2016-08-19
        • 2019-03-10
        • 1970-01-01
        • 2018-12-13
        • 2018-05-22
        • 2016-06-22
        • 2019-04-12
        相关资源
        最近更新 更多