2017-03-14 4 views
0

皆さん、私の流星アプリにajaxリクエストを送信して何らかの方法で処理しようとしています。ここに私のコードです。今、私はクロームコンソールからAJAX要求を行うとき、私はこのエラーにCORSヘッダーは設定されていますが、まだエラーが発生します

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. 

を得る。また、何も私のサーバーのコンソールにログインしていない

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) 

。 しかし、私はヘッダーを設定していませんでしたか?私はそれを間違っているのですか? はまた、私は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 

がある示し、それが必要として私のサーバーのコンソールがすべてをログに記録し、応答を取得します注意してください。

私のヘッダーがすべて設定されている場合、ここで問題は何ですか?

UPDATEエラーをmutdmourとAlianpする

感謝がなくなって、しかしまた別のエラーXMLHttpRequest cannot load https://b2c-hayk94.c9users.io/handlePopups. Response for preflight is invalid (redirect)がありますが、このエラーが何であるかを知っていますか?

UPDATE

どうやらそれはC9の問題でした。 galaxyにデプロイした後、両方の答えが魅力的に機能しますが、私はAlianpのものを受け入れます。その方法で、特定のルートのみのヘッダーを設定するだけです。

+0

飛行前のOPTIONSリクエストをhurl.itでテストしていますか?または、後続のGETまたはPOSTリクエストのみですか? – Quentin

+0

@Quentin私はHurl.itがAjaxリクエストを送信していないと考えています。したがって、プリフライトはありません。しかし、なぜプリフライト要求が私の応答で設定したヘッダーを取得しないのですか? –

+0

私は最近同様の問題を抱えていますが、この質問は役に立ちますか? http://stackoverflow.com/questions/35588699/response-to-preflight-request-doesnt-pass-access-control-check-angularjs私はブラウザの拡張機能が私のコードを動作させることができました。サーバーを構成することです。 –

答えて

1

を試してみてください。

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関数内に追加してチェックします。

+0

ありがとうございました。 これは の結果です。 'XMLHttpRequestはhttps://b2c-hayk94.c9users.io/handlePopupsを読み込めません。プリフライトの応答が無効です(リダイレクト)。 このエラーの内容は分かりますか? –

+0

これは明らかにc9の問題でした。銀河にアップロードした後、これは魅力のように機能します、ありがとう! –

1

はあなたがCORSチェックのためのOPTIONSメソッドを有効にする必要があり、この

//server/main.js 
WebApp.rawConnectHandlers.use(function(req, res, next) { 
    res.setHeader("Access-Control-Allow-Origin", "*"); 
    return next(); 
}); 
+0

ありがとうございます。 これは の結果です。 'XMLHttpRequestはhttps://b2c-hayk94.c9users.io/handlePopupsを読み込めません。プリフライトの応答が無効です(リダイレクト)。 このエラーの内容は分かりますか? –

+0

申し訳ありませんがわからない – mutdmour

関連する問題