2017-02-08 16 views
1

노드에 스케줄에 따라 실행하고 싶은 스크립트가 있습니다. 스크립트가 종료 중이거나 종료되지 않았습니다. 내 데이터베이스 클라이언트가 아직 열려 있기 때문에이 의심됩니다.node.js에서 포스트 그레스 (pg) 클라이언트 연결을 닫습니다.

var client = new pg.Client(conString); 
client.connect(); 

function registerBundle (innerHash, outterHash) { 
    // some stuff here 
} 

var query = client.query("SELECT id, chain FROM mytable where \ 
    state_ready = true and transaction_id='' "); 

query.on('row', function(row) { 
    var chain = row['chain']; 
    var pg_record = row['id']; 
    console.log(pg_record); 
    var innerHash = "something"; 
    var outerHash = "something else"; 
    var registrar = registerBundle(innerHash, outerHash); 

    var update = client.query('UPDATE mytable SET transaction_id = $1::text \ 
    where id=$2::int', [transactionHash, pg_record]); 
    console.log(chain); 
}); 

다음을 포함하면 업데이트가 실행되기 전에 클라이언트 연결이 닫힙니다. 나는 registerBundle 기능이 완료 될 때까지 기다리는 시간을 모르기 때문에

query.on('end', function() { 
    client.end(); 
}); 

나는에서는 setTimeout 또는 임의의 다른 메커니즘을 사용할 수 없습니다. 또한 내가 업데이트가 완료되면 query.on ('끝'화재 것이라 생각합니다. 아니 이것을 테스트하는 방법을 잘.

내 질문에, 나는 위해 발사 일을해야합니다.

  • 쿼리 DB
  • 프로세스의 각 행 (query.on
  • 값이 각 행 registerBundle에서 반환 된 업데이트 모든 행이 처리 된
  • 닫기 DB 클라이언트/연결.
  • 가 종료 스크립트와 출구 노드

파이썬/PHP 세계에서 꽤 똑바로 보이지만 떨어져 내 자바 스크립트 세계.

답변

1

pg-promise 같은 약속 기반의 인터페이스 길을 가야하는 것입니다 :

var bluebird = require('bluebird'); 
var pgp = require('pg-promise')({ 
    promiseLib: bluebird 
}); 
var db = pgp(/*connection details*/); 

db.tx(t => { 
    // BEGIN executed 
    return t.map('SELECT id, chain FROM mytable where state_ready = $1 and transaction_id = $2', [true, 123], a => { 
     var chain = data.chain; 
     var pg_record = data.id; 
     return t.none('UPDATE mytable SET transaction_id = $1::text where id=$2::int', [transactionHash, pg_record]); 
    }).then(t.batch); // settling all internal queries 
}) 
    .then(data => { 
     // success, COMMIT executed 
    }) 
    .catch(error => { 
     // error, ROLLBACK executed 
    }) 
    .finally(pgp.end); // shuts down the connection pool 

위의 예제는 당신이 요청 정확히 무엇을, 플러스는 트랜잭션을 사용합니다. 그러나 성능상의 이유로 하나의 쿼리로 모든 작업을 수행하려고 할 것입니다.)

more examples을 참조하십시오.

+0

SELECT와 UPDATE 사이의 어느 곳에서나 업데이트에 필요한 값을 얻기 위해 javascript 함수를 호출해야합니다. var pg_record 바로 뒤에 함수를 호출 할 수 있습니까? –

+0

@DavidAaronMcInnis 물론 가능합니다! :) –

+0

이것을 실행하려고하면 "ReferenceError : data is defined"오류가 발생합니다. 이 작업을하기 위해 "a => {"를 "function (data) {"로 변경해야했습니다. 이것이 맞는지 확실하지 않습니다. –