Здравствуйте! Я совсем недавно начал изучать 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 выглядит следующим образом: