Cómo habilitar el uso compartido de recursos de origen cruzado (CORS) en el marco express.js en node.js

Intento crear un servidor web en node.js que admita scripts de dominios cruzados, al mismo tiempo que proporcione archivos estáticos de un directorio público. Estoy usando express.js y no estoy muy seguro de cómo permitir scripts de dominio cruzado ( Access-Control-Allow-Origin: * ).

Vi esta publicación , que no encontré útil.

 var express = require('express') , app = express.createServer(); app.get('/', function (req, res, next) { res.header("Access-Control-Allow-Origin", "*"); res.header("Access-Control-Allow-Headers", "X-Requested-With"); next(); }); app.configure(function () { app.use(express.methodOverride()); app.use(express.bodyParser()); app.use(app.router); }); app.configure('development', function () { app.use(express.static(__dirname + '/public')); app.use(express.errorHandler({ dumpExceptions: true, showStack: true })); }); app.configure('production', function () { var oneYear = 31557600000; // app.use(express.static(__dirname + '/public', { maxAge: oneYear })); app.use(express.static(__dirname + '/public')); app.use(express.errorHandler()); }); app.listen(8888); console.log('express running at http://localhost:%d', 8888); 

Mira el ejemplo de enable-cors.org :

En su aplicación ExpressJS en node.js, haga lo siguiente con sus rutas:

 app.all('/', function(req, res, next) { res.header("Access-Control-Allow-Origin", "*"); res.header("Access-Control-Allow-Headers", "X-Requested-With"); next(); }); app.get('/', function(req, res, next) { // Handle the get for this route }); app.post('/', function(req, res, next) { // Handle the post for this route }); 

La primera llamada ( app.all ) debe hacerse antes que todas las otras rutas en su aplicación (o al menos las que desea que estén CORS habilitadas).

[Editar]

Si desea que los encabezados también aparezcan en archivos estáticos, intente esto (asegúrese de que sea antes de la llamada para use(express.static()) :

 app.use(function(req, res, next) { res.header("Access-Control-Allow-Origin", "*"); res.header("Access-Control-Allow-Headers", "X-Requested-With"); next(); }); 

Probé esto con su código y obtuve los encabezados de los activos del directorio public :

 var express = require('express') , app = express.createServer(); app.configure(function () { app.use(express.methodOverride()); app.use(express.bodyParser()); app.use(function(req, res, next) { res.header("Access-Control-Allow-Origin", "*"); res.header("Access-Control-Allow-Headers", "X-Requested-With"); next(); }); app.use(app.router); }); app.configure('development', function () { app.use(express.static(__dirname + '/public')); app.use(express.errorHandler({ dumpExceptions: true, showStack: true })); }); app.configure('production', function () { app.use(express.static(__dirname + '/public')); app.use(express.errorHandler()); }); app.listen(8888); console.log('express running at http://localhost:%d', 8888); 

Por supuesto, podría empaquetar la función en un módulo para que pueda hacer algo como

 // cors.js module.exports = function() { return function(req, res, next) { res.header("Access-Control-Allow-Origin", "*"); res.header("Access-Control-Allow-Headers", "X-Requested-With"); next(); }; } // server.js cors = require('./cors'); app.use(cors()); 

Siguiendo la solución de @Brandon Tilley, aparentemente no funcionó para mí al principio. No estoy seguro de por qué, tal vez estoy usando Chrome y diferentes versiones de nodo. Después de algunos ajustes menores, ahora está funcionando para mí.

 app.all('*', function(req, res, next) { res.header('Access-Control-Allow-Origin', '*'); res.header('Access-Control-Allow-Methods', 'PUT, GET, POST, DELETE, OPTIONS'); res.header('Access-Control-Allow-Headers', 'Content-Type'); next(); }); 

En caso de que alguien tenga un problema similar al mío, esto podría ser útil.

Prueba con los módulos de cors npm.

 var cors = require('cors') var app = express() app.use(cors()) 

Este módulo proporciona muchas características para ajustar con precisión la configuración de cors como la lista blanca de dominios, habilitando cors para apis específicos, etc.

Yo uso esto:

 var app = express(); app .use(function(req, res, next){ res.header('Access-Control-Allow-Origin', '*'); res.header('Access-Control-Allow-Headers', 'X-Requested-With'); next(); }) .options('*', function(req, res, next){ res.end(); }) ; h.readFiles('controllers').forEach(function(file){ require('./controllers/' + file)(app); }) ; app.listen(port); console.log('server listening on port ' + port); 

este código supone que sus controladores se encuentran en el directorio de controladores. cada archivo en este directorio debería ser algo como esto:

 module.exports = function(app){ app.get('/', function(req, res, next){ res.end('hi'); }); } 

Recomiende usar el módulo cors express. Esto le permite incluir en la lista blanca dominios, permitir / restringir dominios específicamente a rutas, etc.,

Debe establecer Access-Control-Allow-Credentials: true , si desea usar “cookie” a través de “Credenciales”

 app.all('*', function(req, res, next) { res.header('Access-Control-Allow-Origin', '*'); res.header('Access-Control-Allow-Credentials', true); res.header('Access-Control-Allow-Methods', 'PUT, GET, POST, DELETE, OPTIONS'); res.header('Access-Control-Allow-Headers', 'Content-Type'); next(); }); 

Un paso adicional que necesitaba realizar era cambiar mi URL de http://localhost a http://127.0.0.0