
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
в экспрессе нет такой логики

KlonD90
23.01.2017
20:25:31

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

Evgeny
23.01.2017
20:26:34

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

hamper ?
23.01.2017
21:58:07
Кладешь в req промис и ловишь его после next

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

Ilya
23.01.2017
22:03:26
ща продебажу

Vint
23.01.2017
22:03:53

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

Bogdan
23.01.2017
22:06:13

Google

Vint
23.01.2017
22:07:10

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

Ilya
23.01.2017
22:09:14

Bogdan
23.01.2017
22:10:39

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

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

Ilya
23.01.2017
22:12:06
не ловит

Vladimir
23.01.2017
22:12:28

Bogdan
23.01.2017
22:12:35

Vint
23.01.2017
22:12:51

Vint
23.01.2017
22:13:43

Bogdan
23.01.2017
22:14:44

Vint
23.01.2017
22:17:02

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

Bogdan
23.01.2017
22:20:32

Google

Vint
23.01.2017
22:20:36

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

Vint
23.01.2017
22:21:58

Bogdan
23.01.2017
22:23:32

Vint
23.01.2017
22:27:38

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()
}
}

Vint
23.01.2017
22:39:16

Bogdan
23.01.2017
22:46:27

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

Roman
23.01.2017
22:49:34

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

Roman
23.01.2017
22:50:13

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

Roman
23.01.2017
22:51:38

Google

hamper ?
23.01.2017
22:51:38
Ну и nginx удобно использовать если у тебя десяток серверов кластер и надо запросы раскидать
Нет, зачем http2?
Например гуглобот вроде как предпочитает http2 обычному в раздаче рейтингов.

Roman
23.01.2017
22:52:17

hamper ?
23.01.2017
22:52:45
И статистику удобно в stub выдает

Roman
23.01.2017
22:53:46

hamper ?
23.01.2017
22:54:12

Roman
23.01.2017
22:55:09
Оох

hamper ?
23.01.2017
22:55:29
Нужно знать скольлко было 200 ответов, сколько 499, сколько 5xx
После этого логи можно удалять.
Хотя часто приходится в них лезть и искать конкретный запрос в пределах пары часов.

Roman
23.01.2017
22:56:11

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 вообще клиентам выгружались.