#node.js #postgresql
#node.js #postgresql
Вопрос:
Я новичок в nodejs и пытаюсь получить некоторые данные со своего сервера PG. Мне удается получить свои данные, но не в том порядке, в котором я ожидал. Возможно, я не использую это должным образом, кто-нибудь может помочь?
Вот пример кода :
var pg = require('pg');
var db = new pg.Client(conString);
var link = db.connect();
var data = {};
// -----
console.log(prefix 'Fetching categories');
db.query('SELECT DISTINCT category FROM cc WHERE category IS NOT NULL', function(err, data){
data.rows.forEach(function(row){
data[row.category] = {}; // initialise
});
console.log('1111111',data,'---------');
});
console.log('2222222',data,'---------');
for (var category in data)
{
console.log(prefix 'Listing values for on "' category '"');
var values = db.query('SELECT SUBSTRING(date::varchar, 1,7) AS month, sum(amount) FROM cc WHERE category = '' category '' GROUP BY 1 ORDER BY 1', function(err, data){
console.log('Got values',data.rows);
});
}
// -----
console.log(prefix 'Ending connection to database');
// db.end();
// -----
console.log(prefix 'Ending transaction on server side');
response.end();
Я получаю 222222 before 1111111
:/ поэтому мой результат отправляется как пустой, а затем он заполняется: (Что я должен делать?
Спасибо за ваше время!
Комментарии:
1. Конечно, вы получили 222222 до 1111111. Вот как работает асинхронность в node. Ваш первый запрос запускается, после чего node не ожидает завершения запроса, а просто продолжает печатать 222222. Это неблокирующее, что является очень важной особенностью node. Если вы хотите выполнить 2-й запрос после выполнения 1-го запроса, вам нужно поместить его в обратный вызов 1-го запроса, который где console.log(‘1111111′,data,’———‘); есть.
Ответ №1:
Взгляните на обещания :https://github.com/promises-aplus/promises-spec. (одна хорошая библиотека для nodejs — q — http://documentup.com/kriskowal/q /). они действительно полезны для поддержания связности кода nodejs и чистоты во всех этих обратных вызовах. обязательное условие для каждого разработчика nodejs.