Dva: получить междоменные проблемы

Созданный на 17 нояб. 2016  ·  18Комментарии  ·  Источник: dvajs/dva

Вызовите метод уровня сервиса в эффектах слоя модели, код выглядит следующим образом:

// 引入service
import { login } from '../services/authentication';
// effects
*login({ payload: { currentUser } }, { select, call, put }) {
      const data = yield call(login, {
        "mobile": currentUser.userName,
        "password": currentUser.password
      });
      console.log('my response data is:', data);

Запрос сервера просмотра браузера является нормальным, но данные печати показывают ошибку, сгенерированную checkstatus, ответ, возвращаемый до checkstatus, выглядит следующим образом:

body:(...)
bodyUsed:false
headers:Headers
    __proto__: Headers
ok:false
status:0
statusText:""
type:"opaque"
url:""

Извините, в чем может быть проблема? Запрос просмотра браузера возвращает статус 200, но полученный здесь код статуса http равен 0. Это мои эффекты или выборка?

277 Кстати, проблема добавления заголовков все еще существует.Это тоже версия dva6.0.Может быть проблема isomorphic-fetch?

faq question

Самый полезный комментарий

  1. Ошибка, вызванная выборкой, не позволила четко определить причину проблемы и была изменена на решение Promise (axios), чтобы знать, что это междоменная проблема.
    2. Я нашел в Интернете сообщение, в котором легко решить междоменную проблему, установил режим: no-cors и пошел в обход.
    3. Наконец, я получил более глубокое понимание fetch, прочитав официальные документы fetch, и, наконец, решил проблему, установив режим: cors.
    Резюме: ключ к решению междоменных проблем лежит в понимании протоколов xhr и http.Самая большая разница между указанием режима как Cors и no-cors заключается в том, что cors проходит через параметр s перед отправкой запроса.

Все 18 Комментарий

Это не проблема с эффектами, это должно быть связано с выборкой. Междоменный?

Я сделал междоменный запрос и изменил его на axios, чтобы сделать запрос. Все в норме. Какие параметры необходимо настроить для выборки для поддержки междоменного доступа?

Я не пробовал это специально, но, глядя на документацию по выборке, говорится, что междоменная обработка совместима с XMLHTTPRequest. Может ли это быть связано с тем, что файл cookie не был доставлен? https://www.npmjs.com/package/whatwg-fetch#sending -cookies

В моем проекте сервер написан на языке GO.Пока сервер настроен на поддержку / разрешение междоменного доступа, выборка клиента не требует дополнительной настройки;

Я думаю, что @xaviertung может рассмотреть возможность проверки журнала сервера, чтобы проанализировать / определить местонахождение проблемы. Если это проблема аутентификации, решите проблему аутентификации :)

В 8:30 18 ноября 2016 г. chencheng (云 谦) [email protected] написал:

Я не пробовал это специально, но, глядя на документацию по выборке, говорится, что междоменная обработка совместима с XMLHTTPRequest. Может ли это быть связано с тем, что файл cookie не был доставлен? https://www.npmjs.com/package/whatwg-fetch#sending -cookies https://www.npmjs.com/package/whatwg-fetch#sending -cookies
-
Вы получаете это, потому что подписаны на эту ветку.
Ответьте на это электронное письмо напрямую, просмотрите его на GitHub https://github.com/dvajs/dva/issues/282#issuecomment -261413729 или отключите поток https://github.com/notifications/unsubscribe-auth/ACv7UniRkGq0Uv8XFBUeNMyWpJBe5. 4

Спасибо, проблема решена, это проблема режима и настройки учетных данных.

Как решить, давайте поговорим о плане? Другие люди могут столкнуться с ним позже.

  1. Ошибка, вызванная выборкой, не позволила четко определить причину проблемы и была изменена на решение Promise (axios), чтобы знать, что это междоменная проблема.
    2. Я нашел в Интернете сообщение, в котором легко решить междоменную проблему, установил режим: no-cors и пошел в обход.
    3. Наконец, я получил более глубокое понимание fetch, прочитав официальные документы fetch, и, наконец, решил проблему, установив режим: cors.
    Резюме: ключ к решению междоменных проблем лежит в понимании протоколов xhr и http.Самая большая разница между указанием режима как Cors и no-cors заключается в том, что cors проходит через параметр s перед отправкой запроса.

@sorrycc teacher, я также столкнулся с некоторыми проблемами с междоменной выборкой. После использования запроса выборки в консоли появился запрос 200 параметров. Фон может входить в точку останова. Метод оценки - GET (мой настоящий запрос), а передняя часть использует response.json () Фоновые данные также могут быть получены, но в консоли нет записи запросов GET, только параметры. Если вы используете ajax, все в порядке. В консоли есть запросы как Option, так и GET.

@AsceticBoy похоже, что это проблема с консолью. Есть ли в ней фильтрация?

@xaviertung Межсайтовый интерфейс должен только установить режим; cors?
Я добавил учетные данные: «включить» в заголовок, и я сообщу об ошибке, что запрос не разрешен.
Отладка сейчас затруднительна. Мне приходится каждый раз менять стоимостную область, а затем компилировать интерфейс и помещать его во внутренний проект для отладки.
Как мне настроить бэкэнд nginx + tomcat (spring), который я использую?Спасибо

@wuyongdec необходимо проверить, открыт ли сервер, чтобы разрешить междоменную конфигурацию.

@wuyongdec dora поддерживает междоменную отладку

@xaviertung Сервер был открыт, но сервер отказался, когда были добавлены учетные данные: 'include'.

@jingchenxu Есть ли документация?

Я столкнулся с этой проблемой, потому что прокси не был настроен в .roadhogrc. Приглашение также связано с междоменной проблемой.

Измените http://jsonplaceholder.typicode.com/ цели на свой собственный адрес сервера.
"proxy": { "/api": { "target": "http://jsonplaceholder.typicode.com/", "changeOrigin": true, "pathRewrite": { "^/api" : "" } } }

@wuyongdec Я тоже столкнулся с той же проблемой, что и вы, вы ее решили? Как это разрешилось?

Отдельные передняя и задняя части для междоменной конфигурации! ! ! Аутентификация без файлов cookie, конфигурация аутентификации JWT! !
Решить невозможность междоменных запросов,
Во-первых, не устанавливайте прокси в config.js. Эта конфигурация может использоваться только для локальной разработки и будет недействительной после сборки.

Мой план:
Настройте в .env (если нет, создайте в корневом каталоге)
При запросе API прочтите адрес сервера. (Измените request.js)

nghin / apache / php сервер плюс
add_header Access-Control-Allow-Origin * always; ### (Начиная с Nginx 1.7.5)

add_header Доступ-Контроль-Разрешить-Методы GET, POST, OPTIONS, HEAD, PUT;
add_header Access-Control-Allow-Headers «Авторизация, тип содержимого»;

Фронтч фентч:
credentials: 'omit' // Это означает, что файлы cookie не должны отправляться, и требуются междоменные запросы
header: {
Авторизация: localStorage.getItem ('токен входа'),
}

Среди них «авторизация» относится к разным конфигурациям разных серверов в зависимости от метода аутентификации на стороне сервера.

Запишите, что я сделал здесь.
Если доменные имена несовместимы, убедитесь, что серверная часть поддерживает междоменный доступ.
Независимо от того, что это 200 400 500, он должен содержать Access-Control-Allow-Origin и другую информацию.
Следующие два параметра передаются в заголовке выборки.

{
  mode: 'cors',
  credentials: 'include',
}

Сервер nginx пишет следующий заголовок

add_header Access-Control-Allow-Credentials: true
Access-Control-Allow-Headers: Keep-Alive,User-Agent,Cache-Control,Content-Type,Authorization,sbid
Access-Control-Allow-Methods: GET, POST, OPTIONS
Access-Control-Allow-Origin: 你的域名

В настоящее время удаление сообщений и т. Д. Могут работать нормально,
Однако при возникновении другой проблемы nginx потерял Access-Control-Allow-Origin и другую информацию при возврате 401, в результате чего не удалось получить статус ответа на 401 (https://github.com/github/fetch/issues/201 # issuecomment-141777867)
Решение, nginx всегда добавляет
Синтаксис: | add_header имя значение [всегда];
http, сервер, местоположение, если в местоположении

server {
  listen       80;
  server_name  www.google.com;

  #charset koi8-r;
  #access_log  /var/log/nginx/host.access.log  main;

  location / {
    if ($request_method = 'OPTIONS') { 
      add_header Access-Control-Allow-Origin 'http://www.baidu.com' always;
      add_header Access-Control-Allow-Credentials 'true' always; 
      add_header Access-Control-Allow-Methods 'GET, POST, OPTIONS' always;
      add_header Access-Control-Allow-Headers 'Keep-Alive,User-Agent,Cache-Control,Content-Type,Authorization,sbid' always;    
      return 200; 
    }

    root   /home/wwwroot/php;
    index  index.php index.html index.htm;
    try_files $uri $uri/ /index.php?$args;
  }

  location ~ \.php$ {
    add_header Access-Control-Allow-Origin 'http://www.baidu.com' always;
    add_header Access-Control-Allow-Credentials 'true' always; 
    add_header Access-Control-Allow-Methods 'GET, POST, OPTIONS' always;
    add_header Access-Control-Allow-Headers 'Keep-Alive,User-Agent,Cache-Control,Content-Type,Authorization,sbid' always;  
    root /home/wwwroot/php/;
    fastcgi_pass 127.0.0.1:9000;
    fastcgi_index index.php;
    fastcgi_param SCRIPT_FILENAME           $document_root$fastcgi_script_name;
    include fastcgi_params;
  }  
}

server {
  listen       80;
  server_name  www.baidu.com;

  #charset koi8-r;
  #access_log  /var/log/nginx/host.access.log  main;

  location / {
    root   /home/wwwroot/view;
    try_files $uri $uri/ /index.html;
  }  
}
Была ли эта страница полезной?
0 / 5 - 0 рейтинги