javascript - CORS header 已设置但仍然出现错误

标签 javascript ajax node.js meteor cors

大家好,我正在尝试向我的 meteor 应用程序发送 ajax 请求并以某种方式处理它。这是我的代码。

import { WebApp } from 'meteor/webapp'
import ConnectRoute from 'connect-route'
import { Popups } from '../../imports/collections/popups/Popups'

const Fiber = Npm.require('fibers')

function onRoute (req, res, next) {
  res.setHeader('Access-Control-Allow-Origin', '*')
  res.setHeader('Access-Control-Allow-Headers', 'Origin, X-Requested-With, Content-Type, Accept')
  let rawPostBody = ''
  let postData = {}
  req.on('data', function (chunk) {
    console.log('on data')
    rawPostBody += chunk.toString()
  })
  req.on('end', function () {
    console.log('on end')
    postData = getPostData(rawPostBody)
    console.log('postData', postData)
    console.log('postData.event', postData.event)
    console.log('postData._id', postData._id)
    Fiber(() => {
      Meteor.call('updateAnalytics', postData, (error, result) => {
        if (error) {
          console.log('updateAnalytics error', error)
        }
        if (result) {

        }
      })
      console.log('res', res)
      res.writeHead(200)
      res.end()
    }).run()
  })
}

function getPostData (rawPostBody) {
  let postData = {}
  let pairs = rawPostBody.split('&')
  for (let i = 0; i < pairs.length; i++) {
    let kv = pairs[i].split('=')
    postData[kv[0]] = decodeURIComponent((kv[1] + '').replace(/\+/g, '%20'))
  }
  return postData
}

const middleware = ConnectRoute(function (router) {
  // 2uik9 is for webhooks requests
  router.post('/handlePopups', onRoute)
})

WebApp.connectHandlers.use(middleware)

现在,当我从 chrome 控制台执行 ajax 请求时,我收到此错误

XMLHttpRequest cannot load https://b2c.meteorapp.com/handlePopups. Response to preflight request doesn't pass access control check: No 'Access-Control-Allow-Origin' header is present on the requested resource. Origin 'http://stackoverflow.com' is therefore not allowed access.

我的服务器控制台中也没有记录任何内容。 但我没有设置标题吗?我做错了吗? 另请注意,当我使用类似 Hurl.it 的测试 http 请求服务时它得到一个响应,其中显示有标题

HEADERS

Access-Control-Allow-Headers: Origin, X-Requested-With, Content-Type, Accept
Access-Control-Allow-Origin: *
Content-Length: 0
Content-Type: text/plain; charset=utf-8
Date: Tue, 14 Mar 2017 10:39:59 GMT
Set-Cookie: galaxy-sticky=ESEFdEqGgiFCeS9P9-ras9; Path=/; HttpOnly

我的服务器控制台会记录所有内容。

如果我的 header 都已设置,那么这里有什么问题?

更新

感谢 mutdmour 和 Alianp,错误消失了,但是还有另一个错误 XMLHttpRequest 无法加载 https://b2c-hayk94.c9users.io/handlePopups。预检响应无效(重定向)您知道此错误是关于什么的吗?

更新

显然这是一个 c9 问题。部署到 Galaxy 后,这两个答案都像魅力一样工作,但我接受 Alianp 的答案,因为这样我只需为特定路线设置 header 。

最佳答案

您需要启用 OPTIONS 方法来进行 CORS 检查。

router.options('/handlePopups', function (req, res, next) {
    res.setHeader('Access-Control-Allow-Origin', '*');
    res.setHeader('Access-Control-Allow-Headers', 'Origin,X-Requested-With, Content-Type, Accept');
   res.writeHead(200);
   res.end();
});

将此代码添加到 ConnectRoute 函数中并检查它。

关于javascript - CORS header 已设置但仍然出现错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42783958/

相关文章:

javascript - 在 View 和 Controller 之间更新 Angular ng-repeat 数据值的最佳方法是什么?

javascript - 通过 ID 从数组中获取特定 JSON 对象并返回 JSON 对象 (Javascript/JQuery)

javascript - 如何从字符串中删除空格和一组字符

javascript - 如何在移动页面末尾自动显示 "load more"

javascript - 无法访问数据表中的 JSON 对象(JavaScript)(vue.js)

javascript - 如何设置在 node.js 中运行异步函数的时间限制?

javascript - 如何将文件附加到 html 'file' 元素以使用 jquery/js 上传?

php - 如何将图像从 canvas 标签保存到 php 服务器?

ajax - 如何将 axios 添加到 React-redux-universal-hot-example 入门套件中?

node.js - 如何仅为后端安装 meteor ?