我对使用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之外,我也可以使用其他库,但是我喜欢那些由于他们拥有的下载次数,我更喜欢使用流行的东西,因为我发现更容易找到博客文章,帮助和文档的那些。谢谢!
答案 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。“