Vlad
Require('lib/dist/node-version.js')
Vlad
А для тестов в браузере реквайрить браузерную версию
Vlad
Если совсем ничего не получится, то попробуй это https://github.com/jhnns/rewire/blob/master/README.md
Vlad
Какой смысл?
Vlad
В браузере может быть?
Ohar
эмм, плохо себе представляю это
Vlad
Посмотри testem
Vlad
Для начала
Ohar
Посмотришь?
хм, прикольная штука
Ohar
спасибо большое
Evgeny
phantomjs, selenium
Vlad
Лол
Мм?
Ohar
как-то оно сложно вяжется с Mocha + Chai + Babel
Ohar
уф
Vlad
Babel не причем
Vlad
Chai тоже
Vlad
Проблема обычно только в тест-раннерах
Nikolay
Мм?
Просто прозвучало будто про f5 :)
Andrey
Jsdom + мок зависимость не решит проблему?
Nikolay
ктонибудь дружил webpack с mocha, у меня в вебпаке много алиасов, хочу unit тесты написать
Ohar
это оверкилл какой-то
Vlad
ктонибудь дружил webpack с mocha, у меня в вебпаке много алиасов, хочу unit тесты написать
Самое простое - откажись от алиасов и пиши обычные юнит тесты
Vlad
Зачем тут вебпак?
Vlad
это оверкилл какой-то
С ним быстрее 😀
Vlad
Да мне не нужен jsdom
А вообще тебе нужно google how to run tests in the browser
Andrey
Если jsdom оверкил, тогда не знаю как назвать phantomjs)
Ohar
А вообще тебе нужно google how to run tests in the browser
Ну пока ты не сказал, мне даже в голову не приходил этот подход
Ohar
До сих пор все отлично внутри вебшторма тестил просто
Andrey
Внутри вебшторма?
Ohar
Ну через npm test
Evgeny
я, пожалуй, удалю свой недописанный коммент про ci/cd..
Vlad
Какой смысл их тестить в ноде не пойму
Gordey
тут надо понимать, что есть оверкилл по потраченному времени, есть по скорости прохождения/сборки, и тд
Gordey
главное правильно приоритезировать оверкиллы
Ohar
С юнит тестами все норм
Кстати щас понял что там не обязательно браузерную версию либы брать в зависимости. Да и вообще она не очень там нужна
Ohar
Так-то это юнит-тест, там просто генерация id используется из библиотеки просто потому что она уже есть в проекте
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) } });
Roman
В экспрессе нельзя сделать конвейерную обработку запросов потому что 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) } });
Я если честно не понял тебя, но спасибо, буду иметь в виду
Anonymous
Я если честно не понял тебя, но спасибо, буду иметь в виду
когда в экспрессе добавляем миддлварку мы не можем получить значение следующей миддлварки после того как она выполнится. И соотвественно не сможем подписаться на промис который вернет миддлварка потому что express его отбросил app.use(function(req,res,next){ console.log('start'); var result = next(); //всегда будет undefined даже если миддлварка вернет какое-то значение; result.then(()=>{ console.log('end'); }) }) app.use(function(req,res,next){ return new Promise(res=>{ setTimeout(res, 1000); }) })
hamper 𓅝
В мидлварках можно в req пихать что угодно
hamper 𓅝
Можно хоть промисы, хоть значения через нее пропихивать, как через контекст.
Roman
Прикольно. А на сколько это сейчас стабильно?
hamper 𓅝
req.prom = new Promise(res=>{ setTimeout(res, 1000); }) в следующей после next() просто делаешь req.prom.then(...)
Evgeny
Да, да, экспресс - это очень удобно
hamper 𓅝
req это по сути контекст запроса.
Anonymous
req.prom = new Promise(res=>{ setTimeout(res, 1000); }) в следующей после next() просто делаешь req.prom.then(...)
ок, с чистыми промисами это сделать можно, а как ты теперь заюзаешь async-await ? 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}; } });
hamper 𓅝
А экспресс с асинками уже работает? Я просто год его уже не видел.
Anonymous
не работает, как раз по причине того что отбрасывает значение миддлварки и await next() выдаст ошибку потому что next() вернул undefined а не промис
Anonymous
но если нужно то можно заюзать мой патч - https://github.com/expressjs/express/pull/3138 там всего лишь нужно в нескольких строках добавить слово return
Aleksey
Async/await просто сахар над промисами
И генераторами, как многие здесь любят поправлять :DD
hamper 𓅝
а next в экспрессе не синхронный случаем?
Aleksey
а next в экспрессе не синхронный случаем?
next – это же функция. Она может быть чем угодно.
hamper 𓅝
я к тому что ее нет смысла await, просто в req кладешь промис и используешь сразу после next()
Vlad
https://twitter.com/jasnell/status/819618164535214080
Vlad
@vkurchatkin @chicoxyzzy тут в тви говорят, что модулей в ноде не видать ещё год
Dmitrii
по мне дак require лучше
Dmitrii
вообще не вижу плюсов import
Dmitrii
так же как и классы которые завезли не нужная херня
Dmitrii
не вводили бы классы, все и без них нормально бы работало
Dmitrii
так же как щас декораторы пропихнуть пытаются
Dmitrii
obj shortland, arrrow func, деструктуризация, spread, rest, async/await - реально полезные фичи, дающие профит, но вот классы, декораторы очень спорные фичи
Vladimir
В 8 ноде точно можно будет использовать ES модули
Ohar
вообще не вижу плюсов import
Он чище, меньше бойлерплейта
Ohar
так же как и классы которые завезли не нужная херня
Классы тоже уменьшают бойлерплейт
Vladimir
модули уже есть в v8
Vladimir
api есть
Vladimir
больше ничего не нужно
Paul
8 в конце апреля
Nook
Вот ниразу не использовал на сервере esm. И переписывать не собираемся.