2017-03-14 3 views
0

Hallo Leute, ich versuche, eine Ajax-Anfrage an meine Meteor App zu senden und irgendwie damit umzugehen. Hier ist mein Code.CORS-Header gesetzt, aber immer noch einen Fehler

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) 

Nun, wenn ich eine Ajax-Anfrage aus Chromkonsole tun bekomme ich diesen Fehler

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. 

auch nichts in meiner Server-Konsole angemeldet ist. Aber habe ich nicht die Header gesetzt? Mache ich es falsch? Beachten Sie auch, wenn ich einen Test http-Request-Dienst verwenden wie Hurl.it er eine Antwort bekommt, wo es zeigt, dass es die Header

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 

Und meine Server-Konsole protokolliert alles, was, wie es sollte.

Also, wenn meine Header gesetzt sind, was ist das Problem hier?

UPDATE

Dank mutdmour und Alianp der Fehler verschwunden ist, aber es ist noch ein weiterer Fehler XMLHttpRequest cannot load https://b2c-hayk94.c9users.io/handlePopups. Response for preflight is invalid (redirect) Weißt du, was ist dieser Fehler geht?

UPDATE

Anscheinend war es ein c9 Problem. Nach der Bereitstellung in der Galaxie funktionieren beide Antworten wie ein Zauber, allerdings akzeptiere ich Alians, weil ich auf diese Weise nur die Header für eine bestimmte Route festlege.

+0

Testen Sie die OPTIONS-Anfrage vor dem Flug mit hurl.it? Oder nur die nachfolgende GET- oder POST-Anfrage? – Quentin

+0

@Quentin Ich denke, Hurl.it sendet keine Ajax-Anfrage, also gibt es kein Preflight. Aber warum erhält die Preflight-Anfrage nicht die Header, die ich in ihrer Antwort gesetzt habe? –

+0

Ich habe in letzter Zeit ähnliche Probleme gehabt, hilft diese Frage? http://StackOverflow.com/questions/35588699/response-to-preflight-request-doesnt-pass-access-control-check-angularjs Ich fand Benutzer eine Browser-Erweiterung erlaubt meinen Code zu arbeiten, eine dauerhafte Lösung für mich würde sei es, den Server zu konfigurieren. –

Antwort

1

Sie benötigen Überprüfung OPTIONS Methode für CORS zu ermöglichen.

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(); 
}); 

Fügen Sie diesen Code in die ConnectRoute-Funktion ein und überprüfen Sie sie.

+0

Vielen Dank. Dies führt zu 'XMLHttpRequest kann https://b2c-hayk94.c9users.io/handlePopups nicht laden. Antwort für Preflight ist ungültig (Redirect) ' Weißt du, worum es bei diesem Fehler geht? –

+0

Nun, anscheinend war das ein Problem mit c9. Nach dem Hochladen in die Galaxie funktioniert das wie ein Zauber, danke! –

1

Versuchen Sie, diese

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

Vielen Dank. Dies führt zu 'XMLHttpRequest kann https://b2c-hayk94.c9users.io/handlePopups nicht laden. Antwort für Preflight ist ungültig (Redirect) ' Weißt du, worum es bei diesem Fehler geht? –

+0

Entschuldigung, weiß ich nicht – mutdmour

Verwandte Themen