1

SQLスクリプトファイルを開いて読み取り、データベースへの接続を並行して開くコードがいくつかあります。それらが完了すると、接続でファイルの内容が実行されます。ただし、接続結果は「クローズ」する必要があります。データベース接続が成功し、ファイルの読み取りが失敗した場合 (ファイル名が間違っている可能性があります) を処理し、いずれの場合でも接続を閉じることができる必要があります。

これが私が現在使用しているコードですfinally()。クエリが成功または失敗した場合にクライアントを閉じるハンドラーがありますが、ファイルの読み取りが失敗した場合、クライアントは閉じられません。

function execFile(db, file) {
    console.log('Connecting to ' + db);
    return Promise.all([
        connect('postgres://' + credentials + host + '/' + db),
        fs.readFileAsync(file, 'utf8')
    ]).spread(function(client, initSql) {
        console.log('Connected to ' + db);
        console.log('Running init script ' + file);
        return client.queryAsync(initSql).finally(client.end);
    });
}

クライアントを finally ブロックに渡す関数を少し試してみましたbind()が、その複雑さにあまり満足していません。settle()ここで役立つ可能性があると感じており、現在それで遊んでいます。

これを処理する最善の方法は何ですか?

4

1 に答える 1

2
function execFile(db, file) {
    console.log('Connecting to ' + db);
    var client = connect('postgres://' + credentials + host + '/' + db);
    var initSql = fs.readFileAsync(file, 'utf8');
    return Promise.all([client, initSql]).spread(function(client, initSql) {
        console.log('Connected to ' + db);
        console.log('Running init script ' + file);
        return client.queryAsync(initSql);
    }).finally(function() {
       if (client.isFulfilled()) client.inspect().value().end();
    });
}
于 2014-03-20T19:33:02.043 に答える