Vladimir
ну экспресс то при чем
hamper 𓅝
Ставили чистый экспресс и на недельку под максимальную нагрузку жметром
hamper 𓅝
Кстати возможно текла нода, 0.8 вообще глючноватая была местами
Максим
Impress Application Server кто-то юзает?
Vlad
Artur
Vladimir
> @p_hamper
Ну за неделю нагрузки в 6к запросов в секунду там Гб вытекал куда то..
это меньше байта на запрос. Нетипично для утечек
hamper 𓅝
Vladimir
Просто чаще всего, когда говорят об утечках, на самом деле нет никаких утечек
hamper 𓅝
Ну по крайней мере тогда положение спасло переписывание всего на connect и дальше разбираться не стали.
Evgeny
Vladimir
цикличные ссылки не вызывают утечек
hamper 𓅝
Может там просто очередь запросов не успевала разбираться и накапливалась потихоньку...
Evgeny
Я не знаю как что устроено внутри экспресса, но ситуацию когда каакя-то структура будет подтекать только небольшой частью за счет циклических ссылок и повисащих хвостов - видел
Evgeny
Естественно что на один из узлов есть ссылка снаружи
Vladimir
Еще раз - циклические ссылки не приводят к утчечкам
Evgeny
Если на них есть внещние ссылки?
Vladimir
Следовательно, увидеть это проблематично
Vladimir
На кого - на них?
Evgeny
На одну ноду этого циркуляр референса
Vladimir
Циркулярность тогда причем?
hamper 𓅝
Для http времени на написание обертки много уйдет, наверное экспресс возьму, на коа было бы писать проще но на счет него я не знаю на счет производительности и стабильности.
Evgeny
Ничего. Я обьяснял как может быть меньше одного байта утечки на один запрос
Evgeny
Это никак не связано с экспрессом
Vladimir
> @NordLuf
Я обьяснял как может быть меньше одного байта утечки на один запрос
и это не как не объясняет <1 байта
Vladimir
<1 байта можно объяснять только логикой, которая выполняет действия реже чем 1 раз на запрос, причем сильно реже
Vladimir
в экспрессе нет такой логики
Vladimir
> @klond90
Да ну роутер написать дело получаса
в общем то его можно и не писать, а просто юзать регэкспы
Vladimir
да, но в экспрессе ничего такого нет
Evgeny
ОК
hamper 𓅝
Да скорее всего проблема либо в самой ноде была (в одной из версий реально помню что то вытекало сразу на том же коде) либо в логике.
hamper 𓅝
Свет вырубили в доме, видимо имеет смысл спать...
Vladimir
нет
Evgeny
ОК
hamper 𓅝
Погуглил бенчмарки, у всех коа слегка обгоняет экспресс таки
Anonymous
Сравнивая express и koa надо учесть еще самый большой недостаток express - то что на его миддлварах нельзя построить конвеерную обработку запроса
Anonymous
В экспрессе нельзя сделать конвейерную обработку запросов потому что 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
hamper 𓅝
hamper 𓅝
Кладешь в req промис и ловишь его после next
hamper 𓅝
В поле req точнее, как в контекст
Ilya
довольно странная трабла
Vint
Ну, именно. Все middleware в express работают над заполнением req/res.
Обработка ошибок чуть отдельно. Всё.
Ilya
делай поиск по пустому селектору в монге, где 0 записей - все норм
стоит к курсору, который возвращает поиск, применить сортировку, и он мне выдает следующее
Ilya
Vint
Ilya
ща продебажу
Vint
Denis
Я как-то спрашивал про инструмент для отслеживания используемых версий пакетов и смотреть Change Log по мере того, как будут новые релизы. Сейчас нашёл такой инструмент: https://david-dm.org/expressjs/express
Ilya
Ilya
ща апдейтну ноду
hamper 𓅝
Vint
Vladimir
мидлвари не для этого
Vladimir
они строго для работы с http
Ilya
hamper 𓅝
А при чем тут асинк? мы же про экспресс говорим или там асинки поддерживать стали?
Vint
юзаю, если что, node-mongodb-native
Такого не трогал. В общем, нужен stack trace и тогда будет проще понять, что и где. Подпиши process на unhandledRejection, там можно будет найти.
Ilya
Ilya
не ловит
Vlad
Vint
Vint
Ilya
короче забил на ошибку, заюзал сортировку по массиву
hamper 𓅝
А я про такой код говорил:
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)