2016-04-04 8 views
0

ich dieses Modul bin mit cors zu behandeln fordert https://www.npmjs.com/package/cors Ich brauche alle Domänen außer der weißen ListeExpress CORS Domain Whitelist

Von offiziellen CORS-Modul Beispiel zu beschränken:

var whitelist = ['http://example1.com', 'http://example2.com']; 
var corsOptions = { 
    origin: function(origin, callback){ 
    var originIsWhitelisted = whitelist.indexOf(origin) !== -1; 
    callback(null, originIsWhitelisted); 
    } 
}; 

app.get('/products/:id', cors(corsOptions), function(req, res, next){ 
    res.json({msg: 'This is CORS-enabled for a whitelisted domain.'}); 
}); 

Was ich dazu geändert haben Damit es funktioniert:

var origin; 
var corsOptions; 
app.all('*', function (req, res, next) { 
    origin = req.get('origin'); 
    var whitelist = ['http://example1.com', 'http://example2.com']; 
    corsOptions = { 
     origin: function (origin, callback) { 
      var originIsWhitelisted = whitelist.indexOf(origin) !== -1; 
      callback(null, originIsWhitelisted); 
     } 
    }; 
    next(); 
}); 
app.post('/products/:id', cors(corsOptions), function (req, res, next) { 
    res.json({ msg: 'This is CORS-enabled for a whitelisted domain.' }); 
}); 

Dann laufe ich Test von http://localhost:8080 durch zu app.post('/products/:id'...) Entsendung I expecte d es sollte nicht ausgeführt werden, weil http://localhost:8080 nicht auf der weißen Liste ist, aber tatsächlich tat es. Irgendeine Idee warum und wie man das repariert?

Auch didadd ich cors(corsOptions) zu sehen, aber es sagt - not available

+0

Warum funktioniert das ursprüngliche Beispiel aus dem 'cors' Modul Readme nicht für Sie? Ihr Code führt genau das gleiche aus, außer dass er so lange zurückgestellt wird, bis eine Anfrage eingegangen ist. – mscdex

+0

@mscdex Ich habe ein bisschen mehr debuggen und eigentlich funktioniert das Original. Aber ich bin ein wenig verwirrt, warum Zeile 'res.json ({msg: 'Dies ist CORS-aktiviert für eine Domain auf der weißen Liste.');' Ausgeführt werden, aber die Antwort, die ich bekomme, ist tatsächlich 'Nein 'Access-Control-Allow -Origin 'Header ist auf der angeforderten Ressource vorhanden. Origin' – sreginogemoh

Antwort

1

Der Grund dafür ist, dass corsOptions noch undefined ist, wenn cors(corsOptions) (effektiv die gleiche wie cors()) seit cors(corsOptions) ausgewertet wird sofort während des Startvorgangs aufgerufen wird.

+0

Ho 'express' versteht, dass es' No 'Access-Control-Allow-Origin'-Fehler zurückgegeben werden muss, anstatt 'res.json ({msg:' Dies ist CORS-fähig für eine Domain auf der weißen Liste. '}) ; '? Ich kann diese Zeile sehen 'res.json ({msg: 'Dies ist CORS-fähig für eine Domain auf der weißen Liste.');' Wird ausgeführt, wenn eine Anfrage von 'nicht-Whitelist'-Domäne gesendet wird, weil' cors (corsOptions) ' beteiligt sich? – sreginogemoh

+1

'cors (corsOptions)' gibt eine Middleware-Funktion zurück. Diese Funktion wird für jede POST-Anfrage an "/ products /: id" aufgerufen, bevor der eigentliche Routen-Handler aufgerufen wird. Dies ermöglicht der "cors" -Middleware, die Anforderung zu verweigern, bevor sie den Routen-Handler erreicht. Sie können so viele Middleware an "app.post()" oder jede andere Funktion übergeben, die Middleware/Route-Handler akzeptiert und sie in der richtigen Reihenfolge verarbeitet. – mscdex

+0

Ich bin immer noch verwirrt, aber die Antwort scheint recht zu sein, aber der Routenkode wird immer ausgeführt, was nicht ganz richtig ist, weil ich keinen Routenkode benötige, der im Falle einer nicht-weißen Domain ausgeführt wird. Stellen Sie einfach separate Frage hier http://StackOverflow.com/Questions/36393965/Node-Express-Cors-and-Routes auf. – sreginogemoh