2013-06-15 8 views
20

Piszę mały serwer WWW demo dostarczający statyczne html, css i javascript. Serwer wyglądaJak dodać nagłówki CORS do serwera statycznego połączenia?

(function() { 
    "use strict"; 

    var http = require("http"); 
    var connect = require('connect'); 
    var app = connect() 
     .use(connect.logger('dev')) 
     .use(connect.static('home')); 

    var server = http.createServer(app); 
    server.listen(9999, function() { 
     console.log('server is listening'); 
    }); 
})(); 

mojej stronie klienta JavaScript sprawia ajax wzywa do innego serwera. Jak mogę dodać

Access-Control-Allow-Origin: http://example.com 

do mojej odpowiedzi serwera, tak że po stronie klienta JavaScript może zrobić wywołania AJAX?

Odpowiedz

16

Miałem kłopot z wymyśleniem tego odkąd express mnie zepsuł.

Spójrz na enable cors. Zasadniczo musisz dodać Access-Control-Allow-Origin do domeny, w której chcesz włączyć cors. response.setHeaders jest idealny do tego zadania.

Inną rzeczą, na którą należy zwrócić uwagę, jest to, że connect nie ma możliwości obchodzenia się z trasami. Jeśli twoja aplikacja musi mieć różne trasy, prawdopodobnie będziesz musiał napisać logikę dla każdego z nich i dodać nagłówki res do tych, na których chcesz włączyć cors. Możesz użyć do niego req.url.

var http = require("http"); 
var connect = require('connect'); 

var app = connect() 

    .use(connect.logger('dev')) 

    .use(connect.static('home')) 

    .use(function(req, res){ 

    res.setHeader("Access-Control-Allow-Origin", "http://example.com"); 
    res.end('hello world\n'); 

}); 

var server = http.createServer(app); 

server.listen(9999, function() { 

    console.log('server is listening'); 
}); 

Jest to odpowiedź dostałem w Chrome dev narzędzi

HTTP/1.1 200 OK 
Access-Control-Allow-Origin: http://example.com 
Date: Sat, 15 Jun 2013 16:01:59 GMT 
Connection: keep-alive 
Transfer-Encoding: chunked 
+0

Wielkie dzięki, absolutnie idealne! – afx

+0

Cieszę się, że mogę pomóc :) –

6

Mam nadzieję, że to pomoże:

//CORS middleware 
var allowCrossDomain = function(req, res, next) { 
    res.header('Access-Control-Allow-Origin', config.allowedDomains); 
    res.header('Access-Control-Allow-Methods', 'GET,PUT,POST,DELETE'); 
    res.header('Access-Control-Allow-Headers', 'Content-Type'); 

    next(); 
} 

//... 
app.configure(function() { 

    app.use(allowCrossDomain); 
    app.use(express.static(__dirname + '/public')); 
}); 

Więcej szczegółów: How to allow CORS?

+2

res.header musi być res.setHeader dla połączenia middleware 2.0 i więcej – depthfirstdesigner

2

Najprostszą metodą, jeśli używasz gulp byłoby użyć wtyczki gulp o nazwie "gulp-connect" an d "connect-modrewrite" i zdefiniuj nową gulptask, aby przekierować konkretny api. Powoduje to, że apache działa jako serwer proxy dla konkretnego api, aby ominąć żądanie przed lotem, w celu uniknięcia problemów z COR. Zrobiłem to, aby rozwiązać ten problem.

var connect = require('gulp-connect'), 
    modRewrite = require('connect-modrewrite'); 
/** 
* Proxy Config 
*/ 
gulp.task('connect', function() { 
    connect.server({ 
    root: ['./.tmp', './.tmp/{folderLocations}', './src', './bower_components'], 
    port: 9000, 
    livereload: true, 
    middleware: function (connect, opt) { 
     return [ 
     modRewrite([ 
      '^/loginProxy/(.*)$ http://app.xyzdomain.com/service/login/auth/$1 [P]' 
     ]) 
     ]; 
    } 
    }); 
}); 
0

express.static przyjmuje obiekt konfiguracyjny. Można podać właściwość setHeaders iz tej funkcji można ustawić nagłówki odpowiedzi:

app.use(express.static('public', { 
     setHeaders: function setHeaders(res, path, stat) { 
     res.header('Access-Control-Allow-Origin', '*'); 
     res.header('Access-Control-Allow-Methods', 'GET'); 
     res.header('Access-Control-Allow-Headers', 'Content-Type'); 
     } 
    })) 

Parametrami tej funkcji są:

  • res, obiekt odpowiedź.
  • path, Ścieżka do pliku, który jest wysyłany.
  • stat, Obiekt statu pliku, który jest wysyłany.

Życzę, aby zapytanie było dostępne tutaj, aby móc warunkowo ustawić nagłówki CORS w oparciu o nagłówek Origin.

Powiązane problemy