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 выглядит следующим образом: Цитата:
|
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) |
Часовой пояс GMT +3, время: 06:07. |