• JavaScript гинь-гинь есть javascript код, в нём через fetch посылается GET запрос, в этом же запросе добавляется header — Authorization ...., так вот в браузере это работает, а в тестах на PhantomJS нет. В логах вижу CORS запрос (OPTIONS) и больше ничего, при этом почему-то в логах вижу:

    ERROR: 'Unhandled promise rejection', TypeError{}


    куда этот в софте вообще копать, чтобы понять причину и как лечить?

Replies (17)

  • @qnikst, В браузере это работает потому что ajax запрос может быть только на тот же хост и порт, откуда загружена страничка с приложением. Если нужно отправить запрос на левый адрес, то сервер должен явно разрешить браузеру коннектиться к нему с данного адреса, отправляя в ответ на OPTIONS заголовки
    Access-Control-Allow-Origin: foo.client.com
    Access-Control-Allow-Methods: POST, GET, OPTIONS, DELETE

    spring-projects.ru
    Unhandled promise rejection лечится добавлением либо второго параметра then — fetch(..).then(result=>{},error=>{}) либо навешиванием вызова .catch(error=>{}) после .then()
  • @Dema, И в браузере и в phantomjs запрос идёт на другой хост-порт.

    Все необходимые ответы заголовки на OPTIONS запрос тоже делаются. Протокол CORS полностью соблюден. Заголовок Authorization в списке разрешенных есть.

    При этом если я не пытаюсь устанавливать заголовки в phantomjs — то он тот же кросс хостовый запрос шлёт
  • @qnikst, а как в фантоме fetch завелся? или полифил у тебя? Вангую, что косяк или особенность полифила
  • @archive, без понятия, js часть не мной писалась, но до установки заколовков fetch успешно работал..
  • @archive, куда смотреть?
  • @qnikst, А как именно выставляются заголовки?.. Можно кусочек кода?
  • @Dema, Именения в процессе отладки:
    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)});
    ```
  • @archive, судя по стрек трейсу — polyfill
  • @qnikst, у меня был похожий косяк, по разному полифил и 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.
    У тебя наверное это — github.com попробуй там инфу поискать. Ну или пили простой пример с минимум левого, используя полифил и его проверяй.
  • @qnikst, "To pass authorization headers you must set Access-Control-Allow-Credentials to true." developer.mozilla.org "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, скорее всего, он вообще не шлётся.
  • @Dema, Я делаю дополнительные телодвижения со стороны сервера, и я добавил 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
  • @qnikst, github.com это не может быть? URL не через https?. У меня идеи кончились, сорри..
  • @Dema, http, спасибо за подсказки.
  • @Dema, И дополнительное спасибо, та ссылка помогла, опции нужны даже для http.
  • @qnikst, отлично! Буду знать, вдруг когда-нибудь наткнусь!
  • @qnikst, Выкиньте phantomjs к чёртовой матери в пользу chrome headless
  • @LittleChris, по какой-то причине там было сделано с точность до наоборот. спорить с ними не собираюсь