Javascript.RU

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

Падает localhost
Настраиваю rest api на node.js с использованием express, postgreSQL, webpack и handlebars. Возникла следующая проблема: после 5-10 переходов по ссылкам внутри сайта, страница перестает загружаться, во вкладке network хрома (забегая вперед, в firefox проблема та же) висит статус pending, а после 4 минут ожидания выдает net::err_empty_response. В консоли тишина. Рестарт сервера помогает помогает опять на 5-10 переходов. Не понимаю в чем дело.

app.js:

const express =require('express'),
      pg = require('pg'),
      path = require('path'),
      exphbs = require('express-handlebars'),
      bodyParser = require('body-parser'),
      app = express();

var baseSize;
var page;
var booksPerPage = 3;

const hbs = exphbs.create({
    extname: 'hbs', 
    defaultLayout: 'main', 
    layoutsdir: __dirname + '/views/Layouts',

    helpers: {
        pagination: function(index) {
            if (index >= (page-1) * booksPerPage &&  index < (page * booksPerPage)) {
                return true;
            } else {
                return false;
            };
        }
    }

});


app.use(bodyParser.urlencoded({ extended: false }));
app.use(bodyParser.json());
app.set('views', path.join(__dirname, 'views'));
app.engine('hbs', hbs.engine);
app.set('view engine', 'hbs');
app.use(express.static('public'));

const { Pool } = require('pg');
const pool = new Pool({
    host: 'localhost',
    user: 'bookAdmin',
    database: 'Books',
    password: '666',
    port: 5432,
});

app.get('/', (req, res) => {
    res.render('index', {
        style: 'index1.css'
    });
});

app.get('/page=:page', (req, res) => {
    pool.connect((err, client, release) => {
        if (err) {
            return console.error('Error acquiring client', err.stack)
        }
        client.query('SELECT * from "Books" ORDER BY id', (err, result) => {
            if (err) {
                return console.error('Error executing query', err.stack)
            }
            baseSize = (result.rows).length;
            page = req.params.page;
            res.render('pagIndex', {
                Books: result.rows,
                style: 'index.css',
                baseSize: baseSize,
                booksPerPage: booksPerPage
            });
        })
    })
});

app.listen(3000, function(){
    console.log('serv started');
});
Ответить с цитированием
  #2 (permalink)  
Старый 16.04.2020, 16:12
Профессор
Отправить личное сообщение для Nexus Посмотреть профиль Найти все сообщения от Nexus
 
Регистрация: 04.12.2012
Сообщений: 3,245

Дебажте. Расставьте console.log на ключевые позиции и смотрите на каком этапе у вас отваливается процесс.
Ответить с цитированием
  #3 (permalink)  
Старый 16.04.2020, 16:28
Профессор
Отправить личное сообщение для Nexus Посмотреть профиль Найти все сообщения от Nexus
 
Регистрация: 04.12.2012
Сообщений: 3,245

У вас на каждый запрос к странице «/page=age» происходит соединение пула соединений с DB, при этом пул соединения не закрывает.

Возможно у меня недостаточно компетенции, но задам вопросы, которые у меня возникли:
1. При повторной попытке соединения пула к бд закрываются ли предыдущие соединения?
2. Не слишком ли затратно на каждый запрос соединятся с БД?
3. Почему вы не закрываете соединение вручную, если каждый запрос пытаетесь подключится к БД?

Я думаю проблема в том, что у Вас просто превышается лимит соединений с Pg, поэтому ничего не работает.
Из этого следует, что используемый Вами драйвер не закрывает пул соединений перед попыткой повторно подключится к БД или создает и возвращает новый пул соединений.
Непонятно, почему при ошибке подключения к бд нет уведомления о проблеме от драйвера.
Под драйвером я подразумеваю библиотеку "pg".
Ответить с цитированием
  #4 (permalink)  
Старый 16.04.2020, 16:44
Новичок на форуме
Отправить личное сообщение для SatanSeal Посмотреть профиль Найти все сообщения от SatanSeal
 
Регистрация: 16.04.2020
Сообщений: 3

Действительно!
Вы правы в том, что превышается лимит клиентов. серв падает после 10 переходов потому, что по дефолту в пуле 10 соединений максимум.
Просто это мой первый api, поэтому писал не сильно вдаваясь в подробности соединений.
Спасибо Вам огромное! буду разбираться с соединениями
Ответить с цитированием
  #5 (permalink)  
Старый 16.04.2020, 16:45
Профессор
Отправить личное сообщение для Nexus Посмотреть профиль Найти все сообщения от Nexus
 
Регистрация: 04.12.2012
Сообщений: 3,245

Почитал доку «npm pg».
pool.connect - возвращает или создает нового клиента для работы с бд, если пул полон, то драйвер будет ожидать освобождения одного из клиентов.
Цитата:
Acquires a client from the pool. If the pool is 'full' and all clients are currently checked out, this will wait in a FIFO queue until a client becomes available by it being released back to the pool. If there are idle clients in the pool it will be returned to the callback on process.nextTick. If the pool is not full a new client will be created & returned to this callback.
Вы в своем коде постоянно запрашиваете нового клиента из пула, но не освобождаете его после того, как он перестает Вам быть нужным.
Через несколько запросов вы вытаскиваете из пула все соединения и в итоге pool.connect Вам ничего не возвращает, Вы просто остаетесь в вечной FIFO очереди.
Ответить с цитированием
  #6 (permalink)  
Старый 16.04.2020, 16:47
Профессор
Отправить личное сообщение для Nexus Посмотреть профиль Найти все сообщения от Nexus
 
Регистрация: 04.12.2012
Сообщений: 3,245

Воспользуйтесь лучше методом пула «query».
Я думаю вам он идеально подойдет.
Ответить с цитированием
  #7 (permalink)  
Старый 16.04.2020, 16:57
Новичок на форуме
Отправить личное сообщение для SatanSeal Посмотреть профиль Найти все сообщения от SatanSeal
 
Регистрация: 16.04.2020
Сообщений: 3

Сотню плюсов вам в карму!
на стэковерфлоу даже смотреть не стали, а самому понять опыта не хватает. уже неделю бьюсь в стену..
Теперь буду химичить с пулами
Ответить с цитированием
  #8 (permalink)  
Старый 17.04.2020, 10:54
Аватар для SuperZen
Профессор
Отправить личное сообщение для SuperZen Посмотреть профиль Найти все сообщения от SuperZen
 
Регистрация: 08.11.2017
Сообщений: 576

app.get ждет что будет "возвращен" res, судя по тому что там написано, этого не происходит, независимо от того создается пул или нет при каждом запросе... )
Ответить с цитированием
  #9 (permalink)  
Старый 17.04.2020, 12:19
Профессор
Отправить личное сообщение для Nexus Посмотреть профиль Найти все сообщения от Nexus
 
Регистрация: 04.12.2012
Сообщений: 3,245

Сообщение от SuperZen
app.get ждет что будет "возвращен" res
Можете привести цитату из документации, где это указано?
Ответить с цитированием
  #10 (permalink)  
Старый 17.04.2020, 18:17
Аватар для SuperZen
Профессор
Отправить личное сообщение для SuperZen Посмотреть профиль Найти все сообщения от SuperZen
 
Регистрация: 08.11.2017
Сообщений: 576

https://expressjs.com/en/guide/routing.html
Routing refers to how an application’s endpoints (URIs) respond to client requests.
...
Response methods
The methods on the response object (res) in the following table can send a response to the client, and terminate the request-response cycle. If none of these methods are called from a route handler, the client request will be left hanging.

Последний раз редактировалось SuperZen, 17.04.2020 в 18:19.
Ответить с цитированием
Ответ



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

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


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Перенос приложения с localhost на cpanel hosting Elfix Node.JS 2 14.02.2019 14:54
Падает непонятно почему dfcz112 Node.JS 17 27.03.2018 14:53
express 4 domains нужно? nodejs падает? Gozar Node.JS 3 19.06.2015 01:20
Управление html ИЗ localhost Corey Общие вопросы Javascript 5 28.07.2014 15:44
AJAX и FCKeditor: падает IE Andrey2005 AJAX и COMET 0 19.10.2009 11:06