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