Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Серверный JavaScript (node.js, ringo, nitro, sling) Новый топик    Ответить
 Nodejs обработка данных полученных от postgres  [new]
ncux199rus
Member

Откуда:
Сообщений: 138
Добрый день.
Как дождаться данных из postgres?
Проблема в том что при попытке получить данные в массив он пишет undefined. Но при этом в console.log выводит корректные данные.
+

function connection_sql(text = 'select now();', values = []){
    row = {};
    const { Pool, Client } = require('pg');

    const client = new Client({
      user: 'cicada',
      host: '192.168.50.17',
      database: 'test',
      password: '123456',
      port: '5432'
    });
    
    //callback 
    client.connect();
    client.query(text, values, (err, res) => {     
       if (err) {
       console.log(err.stack);
     } else {
       row = res.rows;                
       console.log(row);       //выводит то что надо
     }
     client.end();     
    });
    return row;
}


module.exports.get_arr_db = function(){
    let arr = [];
    const text = 'SELECT temp1 FROM public.testdata limit 100;';
    temp = connection_sql(text);    
    arr = temp.temp1;
    console.log("arr = ", arr);  //здесь пустой массив
    return arr;
};


Console.log
arr =  undefined
[ { temp1: 420 },
  { temp1: 423 },
  { temp1: 425 },
  { temp1: 426 },
  { temp1: 428 },
  { temp1: 426 },
...

13 сен 18, 16:27    [21673864]     Ответить | Цитировать Сообщить модератору
 Re: Nodejs обработка данных полученных от postgres  [new]
skyANA
Member

Откуда: Зеленоград
Сообщений: 26739
ncux199rus,

ну Вы же видите, что console.log("arr = ", arr) выполняется раньше console.log(row), ведь видите?
а всё потому, что client.query - это асинхронная операция
13 сен 18, 18:04    [21674059]     Ответить | Цитировать Сообщить модератору
 Re: Nodejs обработка данных полученных от postgres  [new]
ncux199rus
Member

Откуда:
Сообщений: 138
skyANA,
Вижу.
Понимаю что это асинхронный вызов.
И хочу узнать как правильно с этим бороться.
14 сен 18, 10:02    [21674400]     Ответить | Цитировать Сообщить модератору
 Re: Nodejs обработка данных полученных от postgres  [new]
irbis_al
Member

Откуда: Симферополь
Сообщений: 1545
ncux199rus
skyANA,
Вижу.
Понимаю что это асинхронный вызов.
И хочу узнать как правильно с этим бороться.


Ну есть только один способ с этим бороться это Promise
или современное async await
14 сен 18, 11:52    [21674545]     Ответить | Цитировать Сообщить модератору
 Re: Nodejs обработка данных полученных от postgres  [new]
ncux199rus
Member

Откуда:
Сообщений: 138
irbis_al,
nodejs
lib - pg

Попробовал переписать под promice.
Результат тот же.

+

//подключение бд

function connection_sql(text = 'select now();', values = []){    
    row = {};
    //const { Pool, Client } = require('pg');
    const { Client } = require('pg');
    
    const client = new Client({
      user: 'test',
      host: '192.168.50.17',
      database: 'test',
      password: '123456',
      port: '5432'
    }); 
    client.connect();

// promise
let promise = new Promise((resolve, reject) => {    
    client.query(text, values)
        .then(
        resolve => {
        console.log(resolve.rows);
            }
        )
        .catch(reject => console.error(reject.stack));
    });
    
    promise
        .then (
            result => {
                row = result.rows;
                console.log(result.rows);
            },      
        errors => {
            console.log(errors.stack);
            }
        );
    //client.end()
    console.log(1);
        return row;
}



module.exports.get_arr_db = function(){
    let arr = [];
    const text = 'SELECT temp1 FROM testdata limit 10;';   
    temp =  connection_sql(text);
    arr = temp.temp1;
    console.log("arr = ", arr);
    return arr;
};


console.log
1
a1 =  undefined
[ { temp1: 420 },
  { temp1: 423 },
  { temp1: 425 },
  { temp1: 426 },


Примеры брал отсюда npm pg https://node-postgres.com/features/queries
14 сен 18, 16:21    [21674901]     Ответить | Цитировать Сообщить модератору
 Re: Nodejs обработка данных полученных от postgres  [new]
Агнец за бортом
Member

Откуда:
Сообщений: 1318
ncux199rus
Попробовал переписать под promice.


Надо под promise.

Рановато "под промис" - достаточно колбека.
16 сен 18, 03:20    [21675787]     Ответить | Цитировать Сообщить модератору
 Re: Nodejs обработка данных полученных от postgres  [new]
Агнец за бортом
Member

Откуда:
Сообщений: 1318
function connection_sql(callback){

    text = text || 'select now();';
    values = values || [];    
    callback = callback || function(){};
  
    const { Pool, Client } = require('pg');

    const client = new Client({
      user: 'cicada',
      host: '192.168.50.17',
      database: 'test',
      password: '123456',
      port: '5432'
    });
    
    //callback 
    client.connect();
    client.query(text, values, (err, res) => {     
       if (err) {
       console.log(err.stack);
     } else {               
       callback(res.rows);
     }
     client.end();     
    });
}

var procces_result = function(result){ //Определен тут для примера
    console.log("arr = ", result);  //здесь был  пустой массив
}

module.exports.get_arr_db = function(){ //Вообще - передать procces_result надо тут, а не определять в теле модуля
    let arr = [];
    const text = 'SELECT temp1 FROM public.testdata limit 100;';
    temp = connection_sql(text,procces_result);    
};


А то, что ты написал под промисы - полная }{ерня
16 сен 18, 03:35    [21675789]     Ответить | Цитировать Сообщить модератору
Все форумы / Серверный JavaScript (node.js, ringo, nitro, sling) Ответить