Ошибка «Access-Control-Allow-Origin» в запрошенном ресурсе »выдается после успешного запроса POST - PullRequest
1 голос
/ 27 марта 2019

Я пытаюсь настроить API для получения запросов CORS POST, и я достиг точки, когда данные успешно публикуются, однако я получаю сообщение об ошибке «Доступ к XMLHttpRequest заблокирован политикой CORS: НетЗаголовок «Access-Control-Allow-Origin» присутствует на запрашиваемом ресурсе. »который заставляет вызов AJAX возвращать состояние ошибки в отличие от состояния успеха.

Это вызов AJAX на стороне клиента:

$.ajax({
  type: 'POST',
  url: '<my-server-url>',
  data: JSON.stringify(data),
  contentType: 'application/json',
  success: function(res) {
    console.log(res);
    $('#contactForm').find('.submissionMessage').html('<p>Thanks for registering!</p>').show();
  },
  error: function(err) {
    console.log(err);
    $('#contactForm').find('.submissionMessage').html('<p>Something went wrong with the form submission.</p>').show();
  },
  timeout: 10000
});

Это API на стороне сервера:

function registerNewUser(req, res, next) {
  adminFunctions.newUser(req.body.email, req.body.password, req.body.name, req.body.first, req.body.last,
    req.body.phone, req.body.company, req.body.stateOrProvince, req.body.jobTitle, 
    req.body.token,
    function registeringUser(err, success) {
      var jsonResponse = {
        error: err,
        success: success
      };
      var httpStatus = 201;
      if (err == 'Error: Failed to provide sign-up token.') {
        httpStatus = 401;
      } else if (err == 'Error: User with that email already exists.') {
        httpStatus = 409;
      } else if (err) {
        httpStatus = 500;
      }
      res.status(httpStatus).json(jsonResponse);
    });
}
router.post('/users', rateLimit, registerNewUser);

router.options('/users', rateLimit, function(req, res) {
  res.setHeader('Access-Control-Allow-Origin', '*');
  res.setHeader('Access-Control-Allow-Methods', 'POST');
  res.setHeader('Access-Control-Allow-Credentials', true);
  res.setHeader('Access-Control-Max-Age', '86400'); // 24 hours
  res.setHeader('Access-Control-Allow-Headers', 'X-Requested-With, X-HTTP-Method-Override, Content-Type, Accept');
  res.end();
});

Я попытался ответить dataType на 'jsonp' в вызове AJAX, но я получаю ошибку 404, прежде чем он достигает сервера.

У меня также естьпопытался добавить префикс URL в вызове AJAX к API-интерфейсу cors -where, но это также дает мне 404 до того, как он достигнет сервера.

Единственное, что, похоже, отправляет ответ об успешном выполнении, это когда я включаю Allow-Расширение Control-Allow-Origin Chrome, которое, очевидно, может использоваться только в целях тестирования.

1 Ответ

6 голосов
/ 27 марта 2019

У вас есть несколько вызовов функций, которые добавляют разрешения CORS:

 res.setHeader('Access-Control-Allow-Origin', '*');

… но это все только в ответе на запрос предварительных опций.

Они должны появиться на оба запрос предварительной проверки и ответ с запрошенным ресурсом.

Вы не включили их в ответ на запрос POST.


Этого легче всего достичь с помощью промежуточного программного обеспечения, поэтому вам не нужно дублировать вызовы для заголовков заголовков.,cors пакет - это предварительно написанное, зрелое, хорошо протестированное промежуточное программное обеспечение, которое вы можете использовать вместо того, чтобы изобретать велосипед.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...