Javascript.RU

Создать новую тему Ответ
 
Опции темы Искать в теме
  #1 (permalink)  
Старый 11.10.2017, 13:17
Новичок на форуме
Отправить личное сообщение для Rationabilem Посмотреть профиль Найти все сообщения от Rationabilem
 
Регистрация: 11.10.2017
Сообщений: 1

Node.js + Postgresql. Проблема пустого result.rows
Здравствуйте! Я совсем недавно начал изучать node.js и прошу совета/помощи. Эту проблему не могу решить уже второй день, а время очень сильно поджимает.

Дело в том, что мне необходимо прочитать данный из файла формата '.csv' и эти данные потом занести в базу Postgres. Код не слишком большой (я так думаю), поэтому для наглядности выложу его полностью, если вдруг ошибка будет в абсолютно другом месте.
Проблема заключается вот в чем. Что я прочитал файл csv и записал в базу данные. Но при попытке выборки данных и вывода его через response (цельная строка вывода:
res.render('index', {players: result.rows})
) - result.rows оказывается пустым. Я считываю данные с помощью потока и на момент считывания сразу делаю запись в бд (insert).
Если этого не делать, то данные в result.rows не пропадают, а выводятся на страничку как надо. Я не понимаю пока, каким образом можно сделать запись в бд иначе.
Буду очень благодарен за оказанную помощь, так как уже просто начинается истерика.
Проблема таится точно не в строках запросов.
Код целиком:
// Подключения модулей
const moment     = require("moment"),
      express    = require("express"),
      path       = require("path"),
      bodyParser = require("body-parser"),
      cons       = require("consolidate"),
      dust       = require("dustjs-helpers"),
      fs         = require("fs"),
      csv        = require("fast-csv"),
      pg         = require("pg"),
      app        = express();

//Константы с запросами
const queryInsert       = "INSERT INTO players(nickname, email, reg_time, stat) VALUES($1, $2, $3, $4)",
      queryDropTable    = "DROP TABLE IF EXISTS players",
      queryDropType     = "DROP TYPE IF EXISTS EN",
      queryCreateType   = "CREATE TYPE EN AS ENUM('On','Off')",
      queryCreateTable  = "Create table players (" +
                            "id SERIAL NOT NULL PRIMARY KEY," +
                            "nickname VARCHAR(255) NOT NULL," +
                            "email VARCHAR(255) NOT NULL," +
                            "reg_time INT NOT NULL," +
                            "stat EN NOT NULL)",
      querySelect       = "SELECT nickname, email, reg_time, stat " +
                          "FROM players " +
                          "WHERE stat = 'On' " +
                          "ORDER BY reg_time";

//Строка для подключения базы данных
const connect  = "pg://postgres:password@localhost:5432/tbd";

//Определяет движок Dust для всех файлов с расширением .dust
app.engine('dust', cons.dust);
app.set('view engine', 'dust');
app.set('views', __dirname + '/views');

app.use(express.static(path.join(__dirname, 'public')));

//Middleware
app.use(bodyParser.json());
app.use(bodyParser.urlencoded({extended: false}));
app.get('/', function (req, res) {

    pg.connect(connect, function (err, client, done) {
        if(err){
            return console.error('Error fetching client from pool: ', err);
        }
        client.query(queryDropTable);
        client.query(queryDropType);
        client.query(queryCreateType);
        client.query(queryCreateTable);

        let counter = 0;
        //ЗАПИСЬ ПРОИСХОДИТ В ЭТОМ ПОТОКЕ
        let csvStream = csv.fromPath('players_list.csv')
            .on('data', function(row){
                if(!counter==0) {
                    let items = row[0].split(';');
                    let nickname = items[0].trim();
                    let email = items[1].trim();
                    let reg_time = moment(items[2].trim(), 'D.MM.YYYY H:mm').unix();
                    let stat = items[3].trim();
                    console.log(tempArray);
                    client.query(queryInsert, [nickname, email, reg_time, stat]);
                }
                counter++;
            });

        client.query(querySelect, function (err, result) {
            if (err){
                return console.error('Ошибка выполнения запроса SELECT: ', err);
            }

            res.render('index', {players: result.rows});
            done();
        });
    })
});

app.listen(3000, function () {
    console.log("Сервер запущен на порту 3000");
});



Сам файл .csv выглядит следующим образом:

Цитата:
Ник; Email; Зарегистрирован; Статус
ivan2007; ivan@mmail.ru; 12.12.2007 15:41; On
bigpetr; petr@mailtest.ru; 13.12.2007 20:41; Off
semensemenych; sidr@testmail.ru; 14.12.2007 5:21; Off
ktonetort; lapshin@testtest.ru; 15.12.2007 15:41; On
agentsmith; smith@smith.com; 16.12.2007 3:28; On
pushkin; pas@pas.ru; 17.12.2007 15:41; Off
superstar; lermontov@yay.ru; 18.12.2007 15:41; Off
go99; gogol@gggml.ru; 19.12.1999 15:41; Off

Последний раз редактировалось Rationabilem, 11.10.2017 в 13:31.
Ответить с цитированием
  #2 (permalink)  
Старый 12.10.2017, 17:04
Аватар для EmperioAf
Профессор
Отправить личное сообщение для EmperioAf Посмотреть профиль Найти все сообщения от EmperioAf
 
Регистрация: 15.01.2015
Сообщений: 622

let counter = 0;
        //ЗАПИСЬ ПРОИСХОДИТ В ЭТОМ ПОТОКЕ
        let queryPromises = [];
        let csvStream = csv.fromPath('players_list.csv')
            .on('data', function (row) {
                if (!counter == 0) {
                    let items = row[0].split(';');
                    let nickname = items[0].trim();
                    let email = items[1].trim();
                    let reg_time = moment(items[2].trim(), 'D.MM.YYYY H:mm').unix();
                    let stat = items[3].trim();
                    console.log(tempArray);
                    queryPromises.push(client.query(queryInsert, [nickname, email, reg_time, stat]));
                }
                counter++;
            })
            .on('end', function () {
                Promise.all(queryPromises)
                    .then(() => {
                        client.query(querySelect, function (err, result) {
                            if (err){
                                return console.error('Ошибка выполнения запроса SELECT: ', err);
                            }
                
                            res.render('index', {players: result.rows});
                            done();
                        });
                    })
                    .cathc(err => {
                        // в каком то инсерте произошла ошибка
                        // обрабатываем
                    })
            });


Функция client.query - асинхронная, возвращает Promise, а также позволяет передавать callback функ-ю для совместимости со старыми версиями node-pg.
Это значит, что вы делаете select из бд раньше чем еще выполнится обработчик на csv.fromPath(...args).on('data', callback)
Ответить с цитированием
Ответ



Опции темы Искать в теме
Искать в теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Проблема node.js и JSON.parse EnVires Элементы интерфейса 3 02.08.2016 08:26
Node.js проблема загрузки модуля Didi Node.JS 3 22.12.2014 21:10
Node.js + postgres = проблема соединения gavlig Серверные языки и технологии 0 08.03.2013 01:03
Востребованность разработчиков на Node.js danik.js AJAX и COMET 7 08.12.2012 22:49