Nodejs和postgresql和promises以及ES6

时间:2016-03-11 10:44:07

标签: node.js postgresql ecmascript-6 es6-promise

我是nodejs的新手,我只使用ES6而且我大量使用了生成器。 我试图满足pg模块的“连接”和“查询”功能。 为什么以下代码段不释放主执行上下文并使脚本从shell运行?它工作正常,但在打印结果后会挂起。

免责声明:我对Bluebird.promisfy功能以及pg-promise,knex和bookshelf模块不感兴趣。这些都不符合我的需求。

'use strict';

let co = require('co');
let pg = require('pg').native;

function connect(hostname, username, password, database) {
    let connectionString = `postgres://${username}:${password}@${hostname}/${database}`;
    return new Promise((resolve, reject) => {
        pg.connect(connectionString, function(error, result, done) {
            if(error)
                return reject(error);
            else
                return resolve({ connection: result, release: done });
        });
    });
}

function query(connection, text, values) {
    return new Promise((resolve, reject) => {
        connection.query(text, values, (error, result) => {
            if(error)
                return reject(error);
            else
                return resolve(result);
        });
    });
}

co(function*(){
    try {
        let hostname = 'localhost';
        let username = 'damiano';
        let password = 'damiano';
        let database = 'graph';

        let client = yield connect('localhost', 'user', 'pass', 'graph');
        let result = yield query(client.connection, `select * from vertices v1, vertices v2 limit 1`);
        client.release();
        return result;
    }
    catch(error) {
        console.log(error);
    }
}).then((result) => {
    console.log(result.rows);
    return;
});

编辑: 好吧连接挂了。完成方法似乎什么都不做,连接本身有一个隐藏的方法.end。

1 个答案:

答案 0 :(得分:0)

即使因为它没有回答确切的问题,我仍然会推荐一些不同的东西。我用koa和co成功地使用了这个sequilizejs。 Sequilize的方法返回promises,所以我直接让它们let rows = yield table.findAll({ where: { age: 18 }, raw: true });而且我不必担心连接。