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, время: 17:50. |