node.js - missing - crossorigin
¿Cómo puedo agregar CORS-Headers a un servidor de conexión estática? (4)
Estoy escribiendo un pequeño servidor web de demostración que entrega html, css y javascript. El servidor se parece a
(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'');
});
})();
Mi javascript del lado del cliente hace llamadas ajax a un servidor diferente. Como puedo agregar
Access-Control-Allow-Origin: http://example.com
a mi respuesta del servidor, para que el lado del cliente con javascript pueda hacer la llamada ajax?
El método más sencillo, si está usando gulp, sería usar el complemento gulp llamado "gulp-connect" y "connect-modrewrite" y definir una nueva gulptask para redirigir una api en particular. Esto es para que el apache actúe como un Proxy para la api en particular, para omitir la solicitud previa al vuelo, para evitar el problema de COR. Utilicé la siguiente tarea trilla para superar este problema.
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]''
])
];
}
});
});
Espero que esto sea de ayuda:
//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''));
});
Más detalle: ¿Cómo permitir CORS?
Tuve un poco de dificultad para entender esto ya que express me ha echado a perder.
Echa un vistazo a habilitar cors . Básicamente, lo que necesita hacer es agregar Access-Control-Allow-Origin
al dominio en el que desea habilitar Cors. response.setHeaders es perfecto para esta tarea.
Otra cosa a tener en cuenta es que connect no tiene forma de manejar rutas. Si su aplicación necesita tener diferentes rutas, entonces probablemente tendrá que escribir la lógica para cada una de ellas y agregar encabezados de resolución a los en los que desea habilitar los cors. Puedes usar req.url
para ello.
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'');
});
Esta es la respuesta que obtuve en Chrome Dev Tools.
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
express.static
toma un objeto de configuración. Puede proporcionar la propiedad setHeaders
y desde esa función puede establecer encabezados para la respuesta:
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'');
}
}))
Los parámetros para esta función son:
-
res
, el objeto de respuesta. -
path
, lapath
del archivo que se está enviando. -
stat
, el objeto stat del archivo que se está enviando.
Me gustaría que la solicitud estuviera disponible aquí para poder establecer condicionalmente los encabezados CORS basados en el encabezado de Origin
.