Падает 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'); }); |
Дебажте. Расставьте console.log на ключевые позиции и смотрите на каком этапе у вас отваливается процесс.
|
У вас на каждый запрос к странице «/page=:page» происходит соединение пула соединений с DB, при этом пул соединения не закрывает.
Возможно у меня недостаточно компетенции, но задам вопросы, которые у меня возникли: 1. При повторной попытке соединения пула к бд закрываются ли предыдущие соединения? 2. Не слишком ли затратно на каждый запрос соединятся с БД? 3. Почему вы не закрываете соединение вручную, если каждый запрос пытаетесь подключится к БД? Я думаю проблема в том, что у Вас просто превышается лимит соединений с Pg, поэтому ничего не работает. Из этого следует, что используемый Вами драйвер не закрывает пул соединений перед попыткой повторно подключится к БД или создает и возвращает новый пул соединений. Непонятно, почему при ошибке подключения к бд нет уведомления о проблеме от драйвера. Под драйвером я подразумеваю библиотеку "pg". |
Действительно!
Вы правы в том, что превышается лимит клиентов. серв падает после 10 переходов потому, что по дефолту в пуле 10 соединений максимум. Просто это мой первый api, поэтому писал не сильно вдаваясь в подробности соединений. Спасибо Вам огромное! буду разбираться с соединениями |
Почитал доку «npm pg».
pool.connect - возвращает или создает нового клиента для работы с бд, если пул полон, то драйвер будет ожидать освобождения одного из клиентов. Цитата:
Через несколько запросов вы вытаскиваете из пула все соединения и в итоге pool.connect Вам ничего не возвращает, Вы просто остаетесь в вечной FIFO очереди. |
Воспользуйтесь лучше методом пула «query».
Я думаю вам он идеально подойдет. |
Сотню плюсов вам в карму!
на стэковерфлоу даже смотреть не стали, а самому понять опыта не хватает. уже неделю бьюсь в стену.. Теперь буду химичить с пулами |
app.get ждет что будет "возвращен" res, судя по тому что там написано, этого не происходит, независимо от того создается пул или нет при каждом запросе... )
|
Цитата:
|
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. |
Часовой пояс GMT +3, время: 03:34. |