首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >POST请求成功后抛出“请求的资源上没有'Access-Control-Allow-Origin‘标头”错误

POST请求成功后抛出“请求的资源上没有'Access-Control-Allow-Origin‘标头”错误
EN

Stack Overflow用户
提问于 2019-03-27 06:38:15
回答 1查看 10K关注 0票数 1

我正在尝试设置一个API来接收CORS POST请求,并且我已经到达了成功发布数据的点,但是我得到了一个错误信息:“CORS策略阻止了对XMLHttpRequest的访问:请求的资源上不存在'Access-Control-Allow-Origin‘头。”这导致AJAX调用返回err状态而不是success状态。

这是客户端的AJAX调用:

代码语言:javascript
复制
$.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:

代码语言:javascript
复制
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();
});

我在AJAX调用中尝试了对'jsonp‘的响应dataType,但是在它到达服务器之前我得到了一个404错误。

我还尝试使用cors-anywhere API为AJAX调用中的url添加前缀,但在它到达服务器之前也会给我一个404。

唯一似乎发送成功响应的是当我启用Allow-Control-Allow-Origin Chrome扩展时,该扩展显然只能用于测试目的。

EN

回答 1

Stack Overflow用户

发布于 2019-03-27 07:00:40

你有一堆添加CORS权限的函数调用:

代码语言:javascript
复制
 res.setHeader('Access-Control-Allow-Origin', '*');

…但这些都只在对印前检查选项请求的响应中。

它们必须出现在印前检查选项上,并显示所请求资源的响应。

您还没有将它们包含在POST请求的响应中。

这是使用中间件最容易实现的,因此您不必重复调用头部。cors package是预先编写的、成熟的、经过良好测试的中间件,您可以使用它来代替重复发明轮子。

票数 6
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/55367175

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档