2016-01-27 1 views
3

У меня есть вопрос о наилучшем способе использования Koa с Postgres. Я также (действительно) люблю использовать Bluebird, поэтому я пошел с таким подходом.Использование Koa с bluebird и pg

'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, но мне нравится, что из-за количества загрузок, которые у них есть, я предпочитаю использовать популярные материалы, потому что мне легче найти записи в блогах, помощь и документацию для те. Благодаря!

+1

В моих программах Koa, я использую 'со-pg', который облегает' модуль pg' выставить интерфейс обещание, поэтому 'исходный код соавтора pg' мощи поместите вас на правильный путь. У меня есть базовое приложение Koa 1.x, которое демонстрирует, как мне нравится использовать Koa с Postgres: https://github.com/danneu/koa-skeleton/blob/master/src/db/index.js (также проверьте мой файл 'db/util.js'). – danneu

ответ

-1

Вы также можете попробовать pg-native.

От пкг модуля документации:

«узел-Postgres содержит чистую реализацию протокола JavaScript который довольно быстро, но вы можете дополнительно использовать собственные привязок для увеличения скорости парсинга 20-30%. Обе версии подходят для рабочих нагрузок . Чтобы использовать собственные привязки, сначала установите pg-native. После установки pg-native просто замените require ('pg') на require ('pg'). Native. "

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

1

Bluebird библиотека обещание, очень хороший в этом, но она не должна быть использована в качестве руководства о том, как и с какой базой данных библиотеки для использования. Все, что Promise.promisifyAll(pg); материал на самом деле довольно беден рядом со всеми обещание решений, которые существуют там - knex, massive.js, стр-обещание и т.д.

И если вы хотите наилучшее сочетание 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:[email protected]: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; 
    }); 
Смежные вопросы