есть javascript код, в нём через fetch посылается GET запрос, в этом же запросе добавляется header - Authorization ...., так вот в браузере это работает, а в тестах на PhantomJS нет. В логах вижу CORS запрос (OPTIONS) и больше ничего, при этом почему-то в логах вижу: ERROR: 'Unhandled promise rejection', TypeError{} куда этот в софте вообще копать, чтобы понять причину и как лечить?
2017-08-29 12:00:43

Участники:
@qnikst - 9, @Dema - 5, @rtfmpls - 2, @LittleChris - 1

@Dema
В браузере это работает потому что ajax запрос может быть только на тот же хост и порт, откуда загружена страничка с приложением. Если нужно отправить запрос на левый адрес, то сервер должен явно разрешить браузеру коннектиться к нему с данного адреса, отправляя в ответ на OPTIONS заголовки Access-Control-Allow-Origin: http://foo.client.com Access-Control-Allow-Methods: POST, GET, OPTIONS, DELETE http://spring-projects.ru/understanding/cors/ Unhandled promise rejection лечится добавлением либо второго параметра then — fetch(..).then(result=>{},error=>{}) либо навешиванием вызова .catch(error=>{}) после .then()
#2881741/1 2017-08-29 12:06:14
@qnikst
И в браузере и в phantomjs запрос идёт на другой хост-порт. Все необходимые ответы заголовки на OPTIONS запрос тоже делаются. Протокол CORS полностью соблюден. Заголовок Authorization в списке разрешенных есть. При этом если я не пытаюсь устанавливать заголовки в phantomjs - то он тот же кросс хостовый запрос шлёт
#2881741/2 → /1 2017-08-29 12:16:52
@rtfmpls
а как в фантоме fetch завелся? или полифил у тебя? Вангую, что косяк или особенность полифила
#2881741/3 → /2 2017-08-29 12:18:04
@qnikst
без понятия, js часть не мной писалась, но до установки заколовков fetch успешно работал..
#2881741/4 → /3 2017-08-29 12:18:45
@qnikst
куда смотреть?
#2881741/5 → /3 2017-08-29 12:19:40
@Dema
А как именно выставляются заголовки?.. Можно кусочек кода?
#2881741/6 → /4 2017-08-29 12:21:01
@qnikst
Именения в процессе отладки: 1. authorization1 вместо authorization,чтобы исключить внутренние проблемы 2. сделано явно через Headers() 3. catch добавил вот только что ``` const hdrs = new Headers(); hdrs.append('authorization1', 'Bearer ' + token); return fetch(url, { mehod: 'GET', headers: hdrs // { 'Authorization1': 'Bearer ' + (token?token:'none') } }).then(checkStatus) .then(parseJSON).catch(error => {console.warn(error)}); ```
#2881741/7 → /6 2017-08-29 12:23:40
@qnikst
судя по стрек трейсу - polyfill
#2881741/8 → /3 2017-08-29 12:24:31
@rtfmpls
у меня был похожий косяк, по разному полифил и fetch работали с CORS: > If you have trouble making a request to another domain (a different subdomain or port number also constitutes another domain), please familiarize yourself with all the intricacies and limitations of CORS requests. Because CORS requires participation of the server by implementing specific HTTP response headers, it is often nontrivial to set up or debug. CORS is exclusively handled by the browser's internal mechanisms which this polyfill cannot influence. У тебя наверное это - https://github.com/github/fetch, попробуй там инфу поискать. Ну или пили простой пример с минимум левого, используя полифил и его проверяй.
#2881741/9 → /8 2017-08-29 12:29:57
@Dema
"To pass authorization headers you must set Access-Control-Allow-Credentials to true." https://developer.mozilla.org/en-US/docs/Web/HTTP/Headers/Access-Control-Allow-Credentials "When used as part of a response to a preflight request, this indicates whether or not the actual request can be made using credentials." Судя по всему нужны какие-то дополнительные телодвижения со стороны сервера, чтобы браузер мог ему передавать Authorization. Когда ты переименовываешь header в authorization1, скорее всего, он вообще не шлётся.
#2881741/10 → /7 2017-08-29 12:36:30
@qnikst
Я делаю дополнительные телодвижения со стороны сервера, и я добавил authorization1 в список разрешенныз заголовок и там и там. И опять же кросс-доменный запрос работает в браузере, но не работает в phantomjs. Чтобы не быть голословным, вот вывод из developer console: Access-Control-Allow-Headers:authorization1, Accept, Accept-Language, Content-Language Access-Control-Allow-Methods:GET, HEAD, POST Access-Control-Allow-Origin:* Date:Tue, 29 Aug 2017 12:39:48 GMT Server:Warp/3.2.11 Transfer-Encoding:chunked
#2881741/11 → /10 2017-08-29 12:40:50
@Dema
https://github.com/karma-runner/karma-phantomjs-launcher/issues/74#issuecomment-105326181 это не может быть? URL не через https?. У меня идеи кончились, сорри..
#2881741/12 → /11 2017-08-29 12:46:10
@qnikst
http, спасибо за подсказки.
#2881741/13 → /12 2017-08-29 12:50:08
@qnikst
И дополнительное спасибо, та ссылка помогла, опции нужны даже для http.
#2881741/14 → /12 2017-08-29 13:09:48
@Dema
отлично! Буду знать, вдруг когда-нибудь наткнусь!
#2881741/15 → /14 2017-08-29 13:10:17
@LittleChris
Выкиньте phantomjs к чёртовой матери в пользу chrome headless
#2881741/16 2017-08-29 22:05:52
@qnikst
по какой-то причине там было сделано с точность до наоборот. спорить с ними не собираюсь
#2881741/17 → /16 2017-08-30 06:02:59