使用Koa与蓝鸟和pg

时间:2016-01-27 19:13:45

标签: javascript node.js postgresql bluebird koa

我对使用Kog和Postgres的最佳方法有疑问。我也(真的)喜欢使用Bluebird,所以我采用了这种方法。

'use strict'; 

var db = require('./modules/db.js');
var koa = require('koa');
var app = koa();

app.use(function *(){

    yield db.withConnection(function *(client){

        let id = this.request.query.id;
        let simple_data = yield client.queryAsync('select name from table1 where id = $1', [id]);

        this.response.body = simple_data;
    }.bind(this));
});

app.listen(3000);

这是db.js文件,基本上它使用了Bluebird文档中提到的内容。

... bla bla, some imports

Promise.promisifyAll(pg);

function getSqlConnection() {
    var close;
    return pg.connectAsync(connectionString).spread(function(client, done) {
        close = done;
        return client;
    }).disposer(function() {
        if (close) close();
    });
}


function* withConnection(func){
    yield Promise.using(getSqlConnection(), function (client){
            return Promise.coroutine(func)(client); 
    });
}

module.exports.withConnection = withConnection;

您对此有何建议?我现在非常喜欢它,我已经对它进行了广泛的测试(在负载下,制作错误/异常等),它似乎正常工作。我对这些发生器和其他ES6的东西很新,所以我可能会遗漏一些东西。 我的问题基本上是为什么这么少的人使用这种方法(我觉得很难在网上找到这个例子)?

除了pg和bluebird之外,我也可以使用其他库,但是我喜欢那些由于他们拥有的下载次数,我更喜欢使用流行的东西,因为我发现更容易找到博客文章,帮助和文档的那些。谢谢!

2 个答案:

答案 0 :(得分:1)

Bluebird是一个promise库,非常好用,但它不应该用作指导数据库的使用方式或数据库。在那里存在的所有承诺解决方案旁边,Promise.promisifyAll(pg);所有东西实际上都很差 - knex,massive.js,pg-promise等。

如果您想要pg + bluebird的最佳组合,请尝试pg-promise

var promise = require('bluebird');

var options = {
    promiseLib: promise // Use Bluebird as the promise library
};

var pgp = require("pg-promise")(options);

var db = pgp('postgres://username:password@host:port/database');

db.query('select name from table1 where id = $1', [1])
    .then(function (data) {
    })
    .catch(function (error) {
    });

该库也支持ES6生成器,因此您可以像在示例中一样编写代码。

来自Tasks示例:

db.task(function * (t) {
        let user = yield t.one("select * from users where id=$1", 123);
        return yield t.any("select * from events where login=$1", user.name);
    })
    .then(function (events) {
        // success;
    })
    .catch(function (error) {
        // error;
    });

答案 1 :(得分:-1)

您也可以尝试使用pg-native。

来自pg模块docs:

  

“node-postgres包含纯JavaScript协议实现   这是非常快的,但您可以选择使用本机绑定   解析速度提高20-30%。两个版本都足够了   生产工作量。要使用本机绑定,请先安装   PG-本地。安装pg-native后,只需替换require('pg')   with require('pg')。native。“

https://github.com/brianc/node-postgres