
Vladimir
12.01.2017
14:48:06
вот url parser синхронизировали между нодой и браузером уже хорошо

Ҫѐҏӗѫӑ
12.01.2017
14:48:52
а уже выпустили?
это ж брейкинг ченж

Google

Ҫѐҏӗѫӑ
12.01.2017
14:49:13
в 8 будет видимо

Никита
12.01.2017
16:07:08
Не бреакинг.
semver-minor
https://github.com/nodejs/node/pull/7448
require('url').URL теперь даёт такой же интерфейс, как URL в браузере
А раньше его не было
И да, это в 7.0.0 вошло.

Ҫѐҏӗѫӑ
12.01.2017
16:15:08
а, да
забыл что это св-во

Pavel
12.01.2017
16:42:48
#вопрос Господа, подскажите как быть с такой неприятностью?
// foo.js
import Lib from 'Lib/browser'
function foo () {
//кодище
}
export default foo
// foo.test.js
import foo from './foo'
describe(
'foo', () => {
// тесты валятся с ошибкой «ReferenceError: window is not defined»
}
)
Надо как-то подменять библиотеку версией для NodeJS на время тестирования

Vladimir
12.01.2017
16:54:19

Google

Vladimir
12.01.2017
16:54:31
Если да, то переписать

Pavel
12.01.2017
16:56:23
Мой
Как именно?
Проверять окружение?

Vladimir
12.01.2017
16:57:03
Прокидывать window аргументом

Aleh
12.01.2017
16:57:23
ну а лучше то, что от window надо

Pavel
12.01.2017
16:57:27
эээ куда? В библиотеку?

Aleh
12.01.2017
16:57:42
а если она от dom зависит, то наверное jsdom

Vladimir
12.01.2017
16:58:48

Pavel
12.01.2017
17:00:12
Да, что у тебя из windows используется?
У меня в коде ничего.
У меня подключена библиотека Lib и у неё есть вариант сборки для браузера и вариант для ноды.
Тестируемый модуль написан для работы в браузере и подключает браузерную версию, которая падает при попытке тестировать код нодой.
Что логично
Мне надо на время теста подменять зависимость моего модуля

Vladimir
12.01.2017
17:02:11

Pavel
12.01.2017
17:02:16
А как?

Vladimir
12.01.2017
17:03:04
Я не знаю
Ты же говоришь что есть две версии

Pavel
12.01.2017
17:03:18
Ну да
Мне надо при тесте подменять их
Каким-то образом

Vladimir
12.01.2017
17:03:44
Require('lib/dist/node-version.js')

Google

Vladimir
12.01.2017
17:04:12
А для тестов в браузере реквайрить браузерную версию

Klim
12.01.2017
17:04:19

Vladimir
12.01.2017
17:04:38
Если совсем ничего не получится, то попробуй это https://github.com/jhnns/rewire/blob/master/README.md

Klim
12.01.2017
17:05:12
На одной экспресс точёный
На другой коа дроченый

Vladimir
12.01.2017
17:06:22
Какой смысл?

Pavel
12.01.2017
17:06:36

Vladimir
12.01.2017
17:06:48
В браузере может быть?

Pavel
12.01.2017
17:07:05
эмм, плохо себе представляю это

Vladimir
12.01.2017
17:07:49
Посмотри testem
Для начала

Pavel
12.01.2017
17:11:34
спасибо большое

Evgeny
12.01.2017
17:12:07
phantomjs, selenium

Darth
12.01.2017
17:23:17

Vladimir
12.01.2017
17:23:53

Pavel
12.01.2017
17:25:39
как-то оно сложно вяжется с Mocha + Chai + Babel
уф

Vladimir
12.01.2017
17:26:20
Babel не причем

Google

Vladimir
12.01.2017
17:26:26
Chai тоже
Проблема обычно только в тест-раннерах

Darth
12.01.2017
17:27:27
Мм?
Просто прозвучало будто про f5 :)

Andrey
12.01.2017
17:27:32
Jsdom + мок зависимость не решит проблему?

Nikolay
12.01.2017
17:27:41
ктонибудь дружил webpack с mocha, у меня в вебпаке много алиасов, хочу unit тесты написать

Pavel
12.01.2017
17:28:05
это оверкилл какой-то

Vladimir
12.01.2017
17:29:31
Зачем тут вебпак?

Admin
ERROR: S client not available

Vladimir
12.01.2017
17:30:43

Evgeny
12.01.2017
17:31:23

Andrey
12.01.2017
17:34:06
Если jsdom оверкил, тогда не знаю как назвать phantomjs)

Pavel
12.01.2017
17:35:23
До сих пор все отлично внутри вебшторма тестил просто

Andrey
12.01.2017
17:36:19
Внутри вебшторма?

Pavel
12.01.2017
17:36:38
Ну через npm test

Evgeny
12.01.2017
17:36:42
я, пожалуй, удалю свой недописанный коммент про ci/cd..

Vladimir
12.01.2017
17:37:32

Google

Vladimir
12.01.2017
17:37:47
Какой смысл их тестить в ноде не пойму

Gordey
12.01.2017
17:38:37
тут надо понимать, что есть оверкилл по потраченному времени, есть по скорости прохождения/сборки, и тд
главное правильно приоритезировать оверкиллы

Pavel
12.01.2017
17:39:49
С юнит тестами все норм
Кстати щас понял что там не обязательно браузерную версию либы брать в зависимости. Да и вообще она не очень там нужна

Vladimir
12.01.2017
17:40:56

Pavel
12.01.2017
17:41:22
Так-то это юнит-тест, там просто генерация id используется из библиотеки просто потому что она уже есть в проекте


Bogdan
12.01.2017
18:17:13
Поясните за преимущества коа перед эксперссом?
В экспрессе нельзя сделать конвейерную обработку запросов потому что 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)
}
});


Ramzes
12.01.2017
18:43:49
В экспрессе нельзя сделать конвейерную обработку запросов потому что 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)
}
});
Я если честно не понял тебя, но спасибо, буду иметь в виду


Bogdan
12.01.2017
18:48:44
Я если честно не понял тебя, но спасибо, буду иметь в виду
когда в экспрессе добавляем миддлварку мы не можем получить значение следующей миддлварки после того как она выполнится. И соотвественно не сможем подписаться на промис который вернет миддлварка потому что 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 ?
12.01.2017
18:56:28
В мидлварках можно в req пихать что угодно

Pavel
12.01.2017
18:57:53

hamper ?
12.01.2017
18:57:58
Можно хоть промисы, хоть значения через нее пропихивать, как через контекст.

Ramzes
12.01.2017
18:58:41
Прикольно. А на сколько это сейчас стабильно?

hamper ?
12.01.2017
19:00:05
req.prom = new Promise(res=>{
setTimeout(res, 1000);
})
в следующей после next() просто делаешь req.prom.then(...)

Evgeny
12.01.2017
19:00:27
Да, да, экспресс - это очень удобно

hamper ?
12.01.2017
19:00:46
req это по сути контекст запроса.

Bogdan
12.01.2017
19:01:55
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 ?
12.01.2017
19:06:20
А экспресс с асинками уже работает? Я просто год его уже не видел.

Bogdan
12.01.2017
19:08:35
не работает, как раз по причине того что отбрасывает значение миддлварки и await next() выдаст ошибку потому что next() вернул undefined а не промис
но если нужно то можно заюзать мой патч - https://github.com/expressjs/express/pull/3138 там всего лишь нужно в нескольких строках добавить слово return

Vladimir
12.01.2017
19:19:31
ок, с чистыми промисами это сделать можно, а как ты теперь заюзаешь 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};
}
});
Async/await просто сахар над промисами