setheader res origin nodejs multiple falta control cabecera allow node.js api rest angularjs express

node.js - nodejs - res header('' access control allow origin*



No ''Access-Control-Allow-Origin''-Problema de puerto de nodo/Apache (10)

El código de respuesta solo permite localhost: 8888. Este código no se puede implementar en la producción, o un nombre de servidor y puerto diferente.

Para que funcione para todas las fuentes, usa esto en su lugar:

// Add headers app.use(function (req, res, next) { // Website you wish to allow to connect res.setHeader(''Access-Control-Allow-Origin'', ''*''); // Request methods you wish to allow res.setHeader(''Access-Control-Allow-Methods'', ''GET, POST, OPTIONS, PUT, PATCH, DELETE''); // Request headers you wish to allow res.setHeader(''Access-Control-Allow-Headers'', ''X-Requested-With,content-type''); // Set to true if you need the website to include cookies in the requests sent // to the API (e.g. in case you use sessions) res.setHeader(''Access-Control-Allow-Credentials'', true); // Pass to next layer of middleware next(); });

He creado una pequeña API usando Node / Express y tratando de extraer datos usando Angularjs, pero como mi página html se ejecuta bajo apache en localhost: 8888 y la API del nodo se escucha en el puerto 3000, obtengo el No ''Access-Control- Permitir-Origen ''. Intenté usar node-http-proxy y Vhosts Apache pero no tuve mucho éxito, por favor vea el error completo y el código a continuación.

"XMLHttpRequest no puede cargar localhost: 3000. No hay un encabezado ''Access-Control-Allow-Origin'' presente en el recurso solicitado. Por lo tanto, el origen ''localhost: 8888'' no tiene acceso permitido."

// Api Using Node/Express var express = require(''express''); var app = express(); var contractors = [ { "id": "1", "name": "Joe Blogg", "Weeks": 3, "Photo": "1.png" } ]; app.use(express.bodyParser()); app.get(''/'', function(req, res) { res.json(contractors); }); app.listen(process.env.PORT || 3000); console.log(''Server is running on Port 3000'') // Angular code angular.module(''contractorsApp'', []) .controller(''ContractorsCtrl'', function($scope, $http,$routeParams) { $http.get(''localhost:3000'').success(function(data) { $scope.contractors = data; }) // HTML <body ng-app="contractorsApp"> <div ng-controller="ContractorsCtrl"> <ul> <li ng-repeat="person in contractors">{{person.name}}</li> </ul> </div> </body>


Instala la dependencia de cors en tu proyecto:

npm i --save cors

Agregue a su archivo de configuración del servidor lo siguiente:

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

Funciona para mí con la versión 2.8.4 cors.


Intente agregar el siguiente middleware a su aplicación NodeJS / Express (he agregado algunos comentarios para su conveniencia):

// Add headers app.use(function (req, res, next) { // Website you wish to allow to connect res.setHeader(''Access-Control-Allow-Origin'', ''http://localhost:8888''); // Request methods you wish to allow res.setHeader(''Access-Control-Allow-Methods'', ''GET, POST, OPTIONS, PUT, PATCH, DELETE''); // Request headers you wish to allow res.setHeader(''Access-Control-Allow-Headers'', ''X-Requested-With,content-type''); // Set to true if you need the website to include cookies in the requests sent // to the API (e.g. in case you use sessions) res.setHeader(''Access-Control-Allow-Credentials'', true); // Pass to next layer of middleware next(); });

¡Espero que ayude!


La mejor respuesta funcionó bien para mí, excepto que necesitaba agregar a la lista blanca más de un dominio.

Además, la respuesta principal se debe al hecho de que el middleware no maneja la solicitud de OPTIONS y no la recibe automáticamente.

allowed_origins dominios allowed_origins en la lista blanca como allowed_origins en los allowed_origins en la configuración Express y coloco el dominio correcto según el encabezado de origin ya que Access-Control-Allow-Origin no permite especificar más de un dominio.

Esto es lo que terminé con:

var _ = require(''underscore''); function allowCrossDomain(req, res, next) { res.setHeader(''Access-Control-Allow-Methods'', ''GET, POST, OPTIONS''); var origin = req.headers.origin; if (_.contains(app.get(''allowed_origins''), origin)) { res.setHeader(''Access-Control-Allow-Origin'', origin); } if (req.method === ''OPTIONS'') { res.send(200); } else { next(); } } app.configure(function () { app.use(express.logger()); app.use(express.bodyParser()); app.use(allowCrossDomain); });


La respuesta aceptada está bien, en caso de que prefiera algo más corto, puede usar un complemento llamado cors disponible para Express.js

Es fácil de usar, para este caso particular:

var cors = require(''cors''); // use it before all route definitions app.use(cors({origin: ''http://localhost:8888''}));


Otra forma, es simplemente agregar los encabezados a su ruta:

router.get(''/'', function(req, res) { res.setHeader(''Access-Control-Allow-Origin'', ''*''); res.setHeader(''Access-Control-Allow-Methods'', ''GET, POST, OPTIONS, PUT, PATCH, DELETE''); // If needed res.setHeader(''Access-Control-Allow-Headers'', ''X-Requested-With,content-type''); // If needed res.setHeader(''Access-Control-Allow-Credentials'', true); // If needed res.send(''cors problem fixed:)''); });


Puedes usar "$ http.jsonp"

O

A continuación se muestra el trabajo alrededor de Chrome para pruebas locales.

Necesitas abrir tu chrome con el siguiente comando. (Presione ventana + R)

Chrome.exe --allow-file-access-from-files

Nota: Tu cromo no debe estar abierto. Cuando ejecute este comando, Chrome se abrirá automáticamente.

Si ingresa este comando en el símbolo del sistema, seleccione su directorio de instalación de Chrome y luego use este comando.

Debajo del código de script para abrir chrome en MAC con "--allow-file-access-from-files"

set chromePath to POSIX path of "/Applications/Google Chrome.app/Contents/MacOS/Google Chrome" set switch to " --allow-file-access-from-files" do shell script (quoted form of chromePath) & switch & " > /dev/null 2>&1 &"

segundas opciones

Solo puede usar open(1) para agregar las banderas: open -a ''Google Chrome'' --args --allow-file-access-from-files


//Add following code in app.js of NODEJ Restful api to avoid "Access-Control-Allow-Origin" error in angular 6 or any other framework var express = require(''express''); var app = express(); var cors = require(''cors''); var bodyParser = require(''body-parser''); //enables cors app.use(cors({ ''allowedHeaders'': [''sessionId'', ''Content-Type''], ''exposedHeaders'': [''sessionId''], ''origin'': ''*'', ''methods'': ''GET,HEAD,PUT,PATCH,POST,DELETE'', ''preflightContinue'': false }));


/** * Allow cross origin to access our /public directory from any site. * Make sure this header option is defined before defining of static path to /public directory */ expressApp.use(''/public'',function(req, res, next) { res.setHeader("Access-Control-Allow-Origin", "*"); // Request headers you wish to allow res.setHeader("Access-Control-Allow-Headers", "Origin, X-Requested-With, Content-Type, Accept"); // Set to true if you need the website to include cookies in the requests sent res.setHeader(''Access-Control-Allow-Credentials'', true); // Pass to next layer of middleware next(); }); /** * Server is about set up. Now track for css/js/images request from the * browser directly. Send static resources from "./public" directory. */ expressApp.use(''/public'', express.static(path.join(__dirname, ''public'')));

If you want to set Access-Control-Allow-Origin to a specific static directory you can set the following.


app.all(''*'', function(req, res,next) { /** * Response settings * @type {Object} */ var responseSettings = { "AccessControlAllowOrigin": req.headers.origin, "AccessControlAllowHeaders": "Content-Type,X-CSRF-Token, X-Requested-With, Accept, Accept-Version, Content-Length, Content-MD5, Date, X-Api-Version, X-File-Name", "AccessControlAllowMethods": "POST, GET, PUT, DELETE, OPTIONS", "AccessControlAllowCredentials": true }; /** * Headers */ res.header("Access-Control-Allow-Credentials", responseSettings.AccessControlAllowCredentials); res.header("Access-Control-Allow-Origin", responseSettings.AccessControlAllowOrigin); res.header("Access-Control-Allow-Headers", (req.headers[''access-control-request-headers'']) ? req.headers[''access-control-request-headers''] : "x-requested-with"); res.header("Access-Control-Allow-Methods", (req.headers[''access-control-request-method'']) ? req.headers[''access-control-request-method''] : responseSettings.AccessControlAllowMethods); if (''OPTIONS'' == req.method) { res.send(200); } else { next(); } });