@nodejs_ru

Страница 522 из 2748
Evgeny
23.01.2017
20:24:03
А что мешает сделать внешнюю ссылку в других фреймворках?
Ничего. Я обьяснял как может быть меньше одного байта утечки на один запрос

Это никак не связано с экспрессом

Vladimir
23.01.2017
20:24:40
> @NordLuf Я обьяснял как может быть меньше одного байта утечки на один запрос и это не как не объясняет <1 байта

<1 байта можно объяснять только логикой, которая выполняет действия реже чем 1 раз на запрос, причем сильно реже

Google
Vladimir
23.01.2017
20:25:23
в экспрессе нет такой логики

Vladimir
23.01.2017
20:26:08
> @klond90 Да ну роутер написать дело получаса в общем то его можно и не писать, а просто юзать регэкспы

Evgeny
23.01.2017
20:26:34
<1 байта можно объяснять только логикой, которая выполняет действия реже чем 1 раз на запрос, причем сильно реже
Либо, что какая-то структура заполняется и опустощается чанками, и на 1000, например, запросов остается повисшим указатель на 10 байт, остальные части структуры удаляются

Vladimir
23.01.2017
20:26:53
да, но в экспрессе ничего такого нет

Evgeny
23.01.2017
20:27:13
ОК

hamper ?
23.01.2017
20:28:05
Да скорее всего проблема либо в самой ноде была (в одной из версий реально помню что то вытекало сразу на том же коде) либо в логике.

Свет вырубили в доме, видимо имеет смысл спать...

Evgeny
23.01.2017
20:29:35
да, но в экспрессе ничего такого нет
И в прошлых версиях, из которых еще не повыдергивали модули, тоже не было? Речь то про несколько лет назад

Vladimir
23.01.2017
20:29:58
нет

Evgeny
23.01.2017
20:30:06
ОК

hamper ?
23.01.2017
21:07:59
Погуглил бенчмарки, у всех коа слегка обгоняет экспресс таки

Bogdan
23.01.2017
21:37:55
Сравнивая express и koa надо учесть еще самый большой недостаток express - то что на его миддлварах нельзя построить конвеерную обработку запроса

Google
Bogdan
23.01.2017
21:38:27
В экспрессе нельзя сделать конвейерную обработку запросов потому что express отбрасывает значения middleware-функции и вот такое без патча экспресса сделать не получится //log requests middlewares.push(async(next, req, res) => { console.log('request start:', req.method, req.url); var response = await next(); console.log('request send:', response); res.end(JSON.stringify(response)); console.log('request end:', req.method, req.url); }); //catch errors middlewares.push(async(req, res, next) => { try { return await next(); } catch (e) { console.log('error:', e); res.status(400); return {error: e.message}; } }); middlerawe.push(staticServer) //connect to database middlewares.push(async(next, req, res) => { req.db = await new DB(schema); req.data = {}; try { return await next(); } catch (err) { await req.db.disconnect(); throw err; } }); middlerawe.push(cookieParser) middlewares.push(getCurrentUserOrCreateGuest) middlerawe.push(bodyParser) //map request info to crud operation middlewares.push(async(next, req, res) => { var [table, id] = req.url.split('/').slice(1); var dbActions = { "GET": 'get', "POST": 'add', "PUT": 'update', "DELETE": 'delete' }; req.data.action = dbActions[req.method]; req.data.table = table; req.data.id = id; return await next(); }); //process request in database middlewares.push(async(next, req, res) => { var {table, id, action} = req.data; if(!table) throw new Error('no table'); var index = req.query.index; var body = req.body; if (action == 'get') { return await req.db.get(table, id, {index}) } if (action == 'add') { return await req.db.add(table, body) } if (action == 'update') { return await req.db.update(table, id, body) } if (action == 'delete') { return await req.db.delete(table, id) } });

Vint
23.01.2017
21:53:26
Сравнивая express и koa надо учесть еще самый большой недостаток express - то что на его миддлварах нельзя построить конвеерную обработку запроса
Но это трешак какой-то в примере показан. Смесь всего и вся. Такое можно повторить через единый толстый контроллер, но зачем?

Klim
23.01.2017
21:59:32
чет пиздец ты там написал в коде

hamper ?
23.01.2017
21:59:41
В поле req точнее, как в контекст

Ilya
23.01.2017
22:00:12
довольно странная трабла

Vint
23.01.2017
22:00:47
Ну, именно. Все middleware в express работают над заполнением req/res. Обработка ошибок чуть отдельно. Всё.

Ilya
23.01.2017
22:00:56
делай поиск по пустому селектору в монге, где 0 записей - все норм стоит к курсору, который возвращает поиск, применить сортировку, и он мне выдает следующее

Vint
23.01.2017
22:02:12
А stack ошибки где?

Bogdan
23.01.2017
22:02:44
Кладешь в req промис и ловишь его после next
с асинками такое не пройдет потому что они как раз возвращают промис который отбрасывается экспрессом

Ilya
23.01.2017
22:03:26
А stack ошибки где?
что-то я давно не ловил трейсы у промисов

ща продебажу

Vint
23.01.2017
22:03:53
с асинками такое не пройдет потому что они как раз возвращают промис который отбрасывается экспрессом
Пишется некоторый враппер над контроллерами. То же самое, как обмазывать express промисами.

ща продебажу
Промисы нативные или bluebird, например?

Denis
23.01.2017
22:05:10
Я как-то спрашивал про инструмент для отслеживания используемых версий пакетов и смотреть Change Log по мере того, как будут новые релизы. Сейчас нашёл такой инструмент: https://david-dm.org/expressjs/express

Ilya
23.01.2017
22:05:14
ща апдейтну ноду

hamper ?
23.01.2017
22:05:59
с асинками такое не пройдет потому что они как раз возвращают промис который отбрасывается экспрессом
Разве нельзя сделать в вызвваемом мидлваре req.res = new Promise... А в ввзывающем req.res.then?

Bogdan
23.01.2017
22:06:13
Но это трешак какой-то в примере показан. Смесь всего и вся. Такое можно повторить через единый толстый контроллер, но зачем?
Почему же трешак? Идет обработка запроса в отдельных миддлварах каждый из которых отвечает за свою область. Один логирует, второй обрабатывает ошибки, третий парсит боди, чертвертый будет валидировать данные и потом уже запрос попадает в базу данных после которого еще одна миддлварка будет фильтровать данные для отдачи юзеру. В чем же треш? Я просто объеденил их для наглядности в одном файле

Google
Vladimir
23.01.2017
22:07:18
мидлвари не для этого

они строго для работы с http

Ilya
23.01.2017
22:09:14
Промисы нативные или bluebird, например?
юзаю, если что, node-mongodb-native

Bogdan
23.01.2017
22:10:39
Разве нельзя сделать в вызвваемом мидлваре req.res = new Promise... А в ввзывающем req.res.then?
через чистые промисы да, все можно а вот если через async-await то app.use(async (req,res,next)=>{ console.log('start'); await next() console.log('end') })не получится потому что async возращает промис который отбрасывается экспрессом

hamper ?
23.01.2017
22:11:44
А при чем тут асинк? мы же про экспресс говорим или там асинки поддерживать стали?

Vint
23.01.2017
22:11:49
юзаю, если что, node-mongodb-native
Такого не трогал. В общем, нужен stack trace и тогда будет проще понять, что и где. Подпиши process на unhandledRejection, там можно будет найти.

Bogdan
23.01.2017
22:12:35
Как раз в этом объединении и проблема. static и DB в одной цепочке - зачем? Туда же куки и остальное.
а в чем проблема? в любом случае нужно отфильтровать запросы которые относятся к файлам и те которые относятся к апи, вот этим и занимается миддлварка которая перехватывает запросы

Vint
23.01.2017
22:12:51
через чистые промисы да, все можно а вот если через async-await то app.use(async (req,res,next)=>{ console.log('start'); await next() console.log('end') })не получится потому что async возращает промис который отбрасывается экспрессом
Чистые промисы тоже не получится сразу. Поэтому я и сказал про враппер. Но без патчинга самого express. async не пробовал ещё прикрутить, ради интереса потом напишу.

Bogdan
23.01.2017
22:14:44
А при чем тут асинк? мы же про экспресс говорим или там асинки поддерживать стали?
поддержка асинков как раз и заключается в том чтобы не отбрасывать значения миддлваров, вот в моем пуллреквесте я исправил эту проблему экспресса и он волшебным образом стал поддерживать асинки https://github.com/expressjs/express/pull/3138 но только его не приняли(

Фильтровать надо на уровне роутов, а не вызывая кучу бесполезных (для данного uri) мидлварей.
так они и не вызываются, запрос просто сразу обрабатывается и не проходит дальше по конвееру

Vint
23.01.2017
22:17:02
а в чем проблема? в любом случае нужно отфильтровать запросы которые относятся к файлам и те которые относятся к апи, вот этим и занимается миддлварка которая перехватывает запросы
По сути, идеальная схема роутинга - это конфиг с перечислением отношений роут - список middleware. Где-то куки нужны, где-то raw-body, где-то passport, например. Где-то пучок всего. Но это не на каждый проект годится, естественно.

Ilya
23.01.2017
22:17:44
короче забил на ошибку, заюзал сортировку по массиву

hamper ?
23.01.2017
22:18:13
А я про такой код говорил: const express = require('express') const app = express() app.use((req, res, next) => { next() req.pr.then(x => console.log(x)) }) app.get('/', (req, res) => { req.pr = Promise.resolve(1) res.send('Hello World!') }) app.listen(3000)

Vint
23.01.2017
22:18:28
так они и не вызываются, запрос просто сразу обрабатывается и не проходит дальше по конвееру
Каждый раз дёргается staticServer, файла нет - идём в БД. Так что ли? Кстати, зачем там каждый раз connect и disconnect? Что за хранилище, пула нет?

Bogdan
23.01.2017
22:20:32
Каждый раз дёргается staticServer, файла нет - идём в БД. Так что ли? Кстати, зачем там каждый раз connect и disconnect? Что за хранилище, пула нет?
нет миддварка статиксервера видит что роут относится к файлам и отадет его и не вызывает next() и дальше коннекта к дб и дальнешая обработка запроса не происходит.

Google
Vint
23.01.2017
22:20:36
А я про такой код говорил: const express = require('express') const app = express() app.use((req, res, next) => { next() req.pr.then(x => console.log(x)) }) app.get('/', (req, res) => { req.pr = Promise.resolve(1) res.send('Hello World!') }) app.listen(3000)
req.pr.then(x => console.log(x)) В это строчке начинается "толстота". Есдиный output для всех роутов. Это клёво, если всегда json, например. Но надо ещё и про catch не забыть и прочее.

hamper ?
23.01.2017
22:21:34
Ну да, возможно я изначальную задачу не так понял, в общем спать пора.

Vint
23.01.2017
22:21:58
нет миддварка статиксервера видит что роут относится к файлам и отадет его и не вызывает next() и дальше коннекта к дб и дальнешая обработка запроса не происходит.
Я про обратный пример спрашивал - на каждый запрос к БД идёт обработка через static-server. И это был риторический вопрос) В том плане, что плохо так делать. Имхо, конечно же)

Bogdan
23.01.2017
22:23:32
Я про обратный пример спрашивал - на каждый запрос к БД идёт обработка через static-server. И это был риторический вопрос) В том плане, что плохо так делать. Имхо, конечно же)
ну фильтр запросов в любом случае нужно сделать, вот этим и занимается миддварка, и если видит что запрос отнсится к ней то обрабатывает отдельно

Vint
23.01.2017
22:27:38
ну фильтр запросов в любом случае нужно сделать, вот этим и занимается миддварка, и если видит что запрос отнсится к ней то обрабатывает отдельно
Что подразумевается под фильтром запросов? По мне так это роутингом решается. /api/ - динамика, /public/ - статика, и т.д.

Admin
ERROR: S client not available

Bogdan
23.01.2017
22:27:39
Сам профит от такого конвеерного подхода заключаетя в наглядности схемы обаботки любого запроса. Не нужна куча роутов (кроме некоторых исключений) не нужно на каждую таблицу делать отдельные контроллеры, если придерживаемся стандартной rest-схемы - GET | POST | PUT | DELETE /api/{table}/{id} то достаточно всего одной миддлварки чтобы обработать абсолютно все crud запросы в базе данных (правда не нужно забывать про валидацию в миддлварке перед ней) без создания кучи болерплейта

Vint
23.01.2017
22:28:57
А, ну я так и написал. crud можно описать одним контроллером по /api/*, если так хочется. Остальное - отдельные хендлеры со своими мидлварами.

Т.е. показанная в примере вертикаль - в целом клёво, но не для сетапа всего express-приложения.

Таймураз
23.01.2017
22:32:05
У коа нагляднее код

Bogdan
23.01.2017
22:34:50
Что подразумевается под фильтром запросов? По мне так это роутингом решается. /api/ - динамика, /public/ - статика, и т.д.
зависит от приложения, у меня например еще происходит фильтрация для spa через переопределения роутов на index.html но в целом миддлварка примерно такая async function staticServer(req, res, next){ if (req.url.slice(1, 4) !== 'api' && (req.method == 'HEAD' || req.method == 'GET')) { if(req.headers && typeof req.headers.accept === 'string' && req.headers.accept.indexOf('application/json') !== 0 && (req.headers.accept.indexOf('text/html') !== -1 || req.headers.accept.indexOf('*!/!*') !== -1) && urlUtil.parse(req.url).pathname.indexOf('.') === -1)){ console.log('override path to'); req.url = '/'; } // отдача файла .... } else { await next() } }

Bogdan
23.01.2017
22:46:27
Ну да, есть такая штука. У меня чуть иначе написано. Но только для dev подключается такой middleware. В production этим nginx занимается.
я от nginx отказался) Производительность ноды в отдаче статических файлов не сильно уступает nginx-у чтобы из-за этого внедрять отдельный слой на отдельной технологии с источником возможных проблем или недостатке конфигурации с необходимостью учить целую кучу документации с этой конфигурацией. Тем более что написать статический сервер на ноде (со стримами и всеми проверками) это дело ста строк кода.

hamper ?
23.01.2017
22:49:03
А нода http2 уже нормально поддерживает?

hamper ?
23.01.2017
22:50:04
Для снижения нагрузки например, коннект то один на сессию

hamper ?
23.01.2017
22:50:50
А ну да, nginx то к ноде все равно будет несколько коннектов делать...

Google
hamper ?
23.01.2017
22:51:38
Ну и nginx удобно использовать если у тебя десяток серверов кластер и надо запросы раскидать

Нет, зачем http2?
Например гуглобот вроде как предпочитает http2 обычному в раздаче рейтингов.

hamper ?
23.01.2017
22:52:45
Лучше балансер поставить нормальный
Возможно, но nginx как балансер с возможностью логгирования всех запросов неплохо работает

И статистику удобно в stub выдает

hamper ?
23.01.2017
22:54:12
На проде никто не включает аксесс логи
У нас включены, по ним метрики в графите строятся через collectd tail

Roman
23.01.2017
22:55:09
Оох

hamper ?
23.01.2017
22:55:29
Нужно знать скольлко было 200 ответов, сколько 499, сколько 5xx

После этого логи можно удалять.

Хотя часто приходится в них лезть и искать конкретный запрос в пределах пары часов.

hamper ?
23.01.2017
22:56:12
В целях каких нибудь проверок логики.

Собственно логи хранятся только за 6 часов вроде, это как раз около 100Гб.

А или не, это сутки 100Гб были, потом укоротили.

Denis
23.01.2017
22:57:18
https://github.com/dominictarr/JSONStream крутая штука)

hamper ?
23.01.2017
22:57:40
А в одном проекте логи из nginx вообще клиентам выгружались.

Страница 522 из 2748