2013-07-03 2 views
6

node-postgres의 SELECT 쿼리 결과를 가져 오는 데 문제가 있습니다. 이제 행은 코드 블록 끝에서 비어 있습니다. 이 선택은 POSTGRESQL의 시퀀스에서 다음 값을 반환합니다. 나는 당신이 콜백으로부터 결과를 검색 할 수 없다는 것을 알고 있지만 여기에 수정을 알 수있는 node-postgres (또는 노드에 대한 다른 데이터베이스 모듈)를 사용하는 사람이 있습니까?node-postgres를 사용하는 SELECT 결과 반환

client.connect(); 
var query = client.query("SELECT nextval(\'idgenerator\');"); 
var rows = []; 
query.on('row', function(row, res) { 
    rows.push(row); 
}); 
query.on('end', function(result) { 
    console.log(result.rowCount + ' rows were received'); 
}); 
//client.end(); 
console.log(rows); 

답변

5

자바 스크립트/노드 j 및 이벤트 프로그래밍을 배워야합니다.

query.on('row', function() { /*CODE*/ })은 "행을 읽은 후 CODE를 실행하십시오"를 의미합니다.

이것은 비동기식입니다. 그래서 query.on()은 이벤트를 등록하고 리턴합니다.

So when console.log(rows)이 호출되면 '행'이벤트가 쿼리에서 트리거되지 않았으므로 행이 여전히 비어 있습니다.

query.on ('end') 이벤트 처리기의 본문에 'console.log (rows)'를 넣어야합니다.

코드의 모든 곳에서도 console.log을 작성해야합니다. 을 참조하십시오. 비동기적인 것을 참조하십시오.

+1

감사합니다. 그냥 자바 스크립트에서 콜백을 완전히 이해해야했습니다. – magnudae

4

result.addRow() 메소드를 호출하지 않은 경우 rows 배열은 end 이벤트에서 비어있게됩니다.

var query = client.query("SELECT firstname, lastname FROM emps ORDER BY lastname, firstname"); 

query.on("row", function (row, result) { 
    result.addRow(row); 
}); 

query.on("end", function (result) { 
    console.log(JSON.stringify(result.rows, null, " ")); 
    client.end(); 
}); 

참조 : http://nodeexamples.com/2012/09/21/connecting-to-a-postgresql-database-from-node-js-using-the-pg-module/

+0

대신 콘솔에 표시하는 대신 변수에 행 배열을 반환 할 수 있습니까? –

+1

"end"리스너 내에서 으로 결과를 반환 할 수 있습니다. 1. 콜백 함수를 호출합니다. - 요청 된 소켓 (socket.io 사용)에 대한 응답을 업데이트합니다. 예 : 콜백 (결과); 2. "q"라이브러리 사용 예 : var q = 필요 ('q'); ... // 쿼리 데이터 대기 \ queryDb (params) .then (function (data) { }); ... var queryDb = function (args) { var deferred = q.defer(); ... query.on ('end', function (result) { deferred.resolve (result.rows); }); return deferred.promise; } – abdulwadood

+0

관심을 가져 주셔서 감사합니다. 거대한 js를 발견했습니다. –