node.js - origin - express cors github
¿Cómo permitir CORS? (22)
Además de lo que otros han dicho, no olvide que, a menos que use nodemon, deberá reiniciar su servidor de nodo para que los cambios surtan efecto.
Personalmente había estado actualizando mi navegador por costumbre, olvidando que es el código del lado del servidor.
Estoy tratando de admitir CORS en mi aplicación Node.js que usa el marco web Express.js. He leído una discusión grupal de Google sobre cómo manejar esto y leí algunos artículos sobre cómo funciona CORS. Primero, hice esto (el código está escrito en la sintaxis de CoffeeScript):
app.options "*", (req, res) ->
res.header ''Access-Control-Allow-Origin'', ''*''
res.header ''Access-Control-Allow-Credentials'', true
# try: ''POST, GET, PUT, DELETE, OPTIONS''
res.header ''Access-Control-Allow-Methods'', ''GET, OPTIONS''
# try: ''X-Requested-With, X-HTTP-Method-Override, Content-Type, Accept''
res.header ''Access-Control-Allow-Headers'', ''Content-Type''
# ...
No parece funcionar. Parece que mi navegador (Chrome) no está enviando la solicitud de OPCIONES inicial. Cuando acabo de actualizar el bloque del recurso, necesito enviar una solicitud GET de origen cruzado a:
app.get "/somethingelse", (req, res) ->
# ...
res.header ''Access-Control-Allow-Origin'', ''*''
res.header ''Access-Control-Allow-Credentials'', true
res.header ''Access-Control-Allow-Methods'', ''POST, GET, PUT, DELETE, OPTIONS''
res.header ''Access-Control-Allow-Headers'', ''Content-Type''
# ...
Funciona (en cromo). Esto también funciona en Safari.
He leído que ...
En un navegador que implementa CORS, cada solicitud GET o POST de origen cruzado está precedida por una solicitud OPCIONES que verifica si GET o POST están bien.
Entonces mi pregunta principal es, ¿por qué esto no parece suceder en mi caso? ¿Por qué no se llama mi bloque app.options? ¿Por qué necesito configurar los encabezados en mi bloque principal app.get?
Descubrí que la forma más fácil es usar el paquete node.js cors . El uso más simple es:
var cors = require(''cors'')
var app = express()
app.use(cors())
Hay, por supuesto, muchas formas de configurar el comportamiento a sus necesidades; La página enlazada arriba muestra una serie de ejemplos.
El siguiente código funcionará, pero primero instale cors por:
npm instalar --save cors
Entonces:
module.exports = function(app) {
var express = require("express");
var cors = require(''cors'');
var router = express.Router();
app.use(cors());
app.post("/movies",cors(), function(req, res) {
res.send("test");
});
En escritura de tipos, si desea utilizar el paquete node.js cors
/**
* app.ts
* If you use the cors library
*/
import * as express from "express";
[...]
import * as cors from ''cors'';
class App {
public express: express.Application;
constructor() {
this.express = express();
[..]
this.handleCORSErrors();
}
private handleCORSErrors(): any {
const corsOptions: cors.CorsOptions = {
origin: ''http://example.com'',
optionsSuccessStatus: 200
};
this.express.use(cors(corsOptions));
}
}
export default new App().express;
Si no desea utilizar bibliotecas de terceros para el manejo de errores de cors, debe cambiar el método handleCORSErrors ().
/**
* app.ts
* If you do not use the cors library
*/
import * as express from "express";
[...]
class App {
public express: express.Application;
constructor() {
this.express = express();
[..]
this.handleCORSErrors();
}
private handleCORSErrors(): any {
this.express.use((req, res, next) => {
res.header("Access-Control-Allow-Origin", "*");
res.header(
"Access-Control-ALlow-Headers",
"Origin, X-Requested-With, Content-Type, Accept, Authorization"
);
if (req.method === "OPTIONS") {
res.header(
"Access-Control-Allow-Methods",
"PUT, POST, PATCH, GET, DELETE"
);
return res.status(200).json({});
}
next(); // send the request to the next middleware
});
}
}
export default new App().express;
Para usar el archivo app.ts
/**
* server.ts
*/
import * as http from "http";
import app from "./app";
const server: http.Server = http.createServer(app);
const PORT: any = process.env.PORT || 3000;
server.listen(PORT);
Esto me funciona, ya que es una implementación fácil dentro de las rutas, estoy usando meanjs y está funcionando bien, safari, chrome, etc.
app.route(''/footer-contact-form'').post(emailer.sendFooterMail).options(function(req,res,next){
res.header(''Access-Control-Allow-Origin'', ''*'');
res.header(''Access-Control-Allow-Methods'', ''GET, POST'');
res.header(''Access-Control-Allow-Headers'', ''Origin, X-Requested-With, Content-Type, Accept'');
return res.send(200);
});
Hace algún tiempo, enfrenté este problema, así que hice esto para permitir CORS en mi aplicación de nodejs:
Primero necesitas instalar cors
usando el siguiente comando:
npm install cors --save
Ahora agregue el siguiente código al archivo de inicio de su aplicación como ( app.js or server.js
)
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
}));
require(''./router/index'')(app);
Haz algo como esto:
app.use(function(req, res, next) {
res.header("Access-Control-Allow-Origin", "*");
res.header("Access-Control-Allow-Headers", "Origin, X-Requested-With, Content-Type, Accept");
next();
});
He hecho un middleware más completo adecuado para Express o Connect. Es compatible con las solicitudes de OPTIONS
para la verificación de verificación previa. Tenga en cuenta que permitirá el acceso de CORS a cualquier cosa, es posible que desee realizar algunas comprobaciones si desea limitar el acceso.
app.use(function(req, res, next) {
var oneof = false;
if(req.headers.origin) {
res.header(''Access-Control-Allow-Origin'', req.headers.origin);
oneof = true;
}
if(req.headers[''access-control-request-method'']) {
res.header(''Access-Control-Allow-Methods'', req.headers[''access-control-request-method'']);
oneof = true;
}
if(req.headers[''access-control-request-headers'']) {
res.header(''Access-Control-Allow-Headers'', req.headers[''access-control-request-headers'']);
oneof = true;
}
if(oneof) {
res.header(''Access-Control-Max-Age'', 60 * 60 * 24 * 365);
}
// intercept OPTIONS method
if (oneof && req.method == ''OPTIONS'') {
res.send(200);
}
else {
next();
}
});
Instalar el módulo cors de expressjs. Puedes seguir estos pasos>
Instalación
npm install cors
Uso simple (Habilitar todas las solicitudes CORS)
var express = require(''express'');
var cors = require(''cors'');
var app = express();
app.use(cors());
Para más detalles, vaya a https://github.com/expressjs/cors
Intenta pasar el control a la siguiente ruta coincidente. Si Express coincide con la ruta app.get primero, entonces no continuará en la ruta de opciones a menos que haga esto (observe el uso de next) :
app.get(''somethingelse'', function(req, res, next) {
//..set headers etc.
next();
});
En cuanto a la organización del material CORS, lo puse en un middleware que funciona bien para mí:
//CORS middleware
var allowCrossDomain = function(req, res, next) {
res.header(''Access-Control-Allow-Origin'', ''example.com'');
res.header(''Access-Control-Allow-Methods'', ''GET,PUT,POST,DELETE'');
res.header(''Access-Control-Allow-Headers'', ''Content-Type'');
next();
}
//...
app.configure(function() {
app.use(express.bodyParser());
app.use(express.cookieParser());
app.use(express.session({ secret: ''cool beans'' }));
app.use(express.methodOverride());
app.use(allowCrossDomain);
app.use(app.router);
app.use(express.static(__dirname + ''/public''));
});
Me resultó extremadamente fácil hacer esto con el paquete de solicitud de npm ( https://www.npmjs.com/package/request )
Luego basé mi solución en esta publicación http://blog.javascripting.com/2015/01/17/dont-hassle-with-cors/
''use strict''
const express = require(''express'');
const request = require(''request'');
let proxyConfig = {
url : {
base: ''http://servertoreach.com?id='',
}
}
/* setting up and configuring node express server for the application */
let server = express();
server.set(''port'', 3000);
/* methods forwarded to the servertoreach proxy */
server.use(''/somethingElse'', function(req, res)
{
let url = proxyConfig.url.base + req.query.id;
req.pipe(request(url)).pipe(res);
});
/* start the server */
server.listen(server.get(''port''), function() {
console.log(''express server with a proxy listening on port '' + server.get(''port''));
});
Mi solución más simple con Express 4.2.0 (EDIT: no parece funcionar en 4.3.0) fue:
function supportCrossOriginScript(req, res, next) {
res.status(200);
res.header("Access-Control-Allow-Origin", "*");
res.header("Access-Control-Allow-Headers", "Content-Type");
// res.header("Access-Control-Allow-Headers", "Origin");
// res.header("Access-Control-Allow-Headers", "Origin, X-Requested-With, Content-Type, Accept");
// res.header("Access-Control-Allow-Methods","POST, OPTIONS");
// res.header("Access-Control-Allow-Methods","POST, GET, OPTIONS, DELETE, PUT, HEAD");
// res.header("Access-Control-Max-Age","1728000");
next();
}
// Support CORS
app.options(''/result'', supportCrossOriginScript);
app.post(''/result'', supportCrossOriginScript, function(req, res) {
res.send(''received'');
// do stuff with req
});
Supongo que hacer app.all(''/result'', ...)
también funcionaría ...
Para mantenerse en la misma idea de enrutamiento. Yo uso este código:
app.all(''/*'', function(req, res, next) {
res.header("Access-Control-Allow-Origin", "*");
res.header("Access-Control-Allow-Headers", "X-Requested-With");
next();
});
Similar a http://enable-cors.org/server_expressjs.html ejemplo
Para responder a su pregunta principal, la especificación CORS solo requiere que la llamada OPTIONS preceda a POST o GET si POST o GET tiene un contenido o encabezados no simples.
Los tipos de contenido que requieren una solicitud previa al vuelo de CORS (la llamada de OPCIONES) son cualquier tipo de contenido, excepto los siguientes :
-
application/x-www-form-urlencoded
-
multipart/form-data
-
text/plain
Cualquier otro tipo de contenido aparte de los enumerados anteriormente activará una solicitud previa al vuelo.
En cuanto a los encabezados, cualquier encabezado de solicitud aparte de lo siguiente activará una solicitud previa al vuelo:
-
Accept
-
Accept-Language
-
Content-Language
-
Content-Type
-
DPR
-
Save-Data
-
Viewport-Width
-
Width
Cualquier otro encabezado de solicitud activará la solicitud previa al vuelo.
Por lo tanto, podría agregar un encabezado personalizado como: x-Trigger: CORS
, que debería activar la solicitud previa al vuelo y golpear el bloque de OPCIONES.
Consulte la referencia de la API web de MDN - Solicitudes de CORS con vista previa
Podemos evitar CORS y reenviar las solicitudes al otro servidor:
// config:
var public_folder = __dirname + ''/public''
var apiServerHost = ''http://other.server''
// code:
console.log("starting server...");
var express = require(''express'');
var app = express();
var request = require(''request'');
// serve static files
app.use(express.static(public_folder));
// if not found, serve from another server
app.use(function(req, res) {
var url = apiServerHost + req.url;
req.pipe(request(url)).pipe(res);
});
app.listen(80, function(){
console.log("server ready");
});
Primero simplemente instala cors en tu proyecto. Lleve el terminal (indicador de comandos) y cd
a su directorio de proyecto y ejecute el siguiente comando:
npm install cors --save
Luego tome el archivo server.js y cambie el código para agregar lo siguiente:
var cors = require(''cors'');
var app = express();
app.use(cors());
app.use(function(req, res, next) {
res.header("Access-Control-Allow-Origin", "*");
res.header(''Access-Control-Allow-Methods'', ''DELETE, PUT, GET, POST'');
res.header("Access-Control-Allow-Headers", "Origin, X-Requested-With, Content-Type, Accept");
next();
});
Esto funcionó para mí ..
Pruebas realizadas con Express + node + ionic corriendo en diferentes puertos.
Localhost:8100
Localhost:5000
// CORS (Cross-Origin Resource Sharing) headers to support Cross-site HTTP requests
app.all(''*'', function(req, res, next) {
res.header("Access-Control-Allow-Origin", "*");
res.header("Access-Control-Allow-Headers", "X-Requested-With");
res.header(''Access-Control-Allow-Headers'', ''Content-Type'');
next();
});
Puede referirse al siguiente código para el mismo. Fuente: Academind/node-restful-api
const express = require(''express'');
const app = express();
//acts as a middleware
//to handle CORS Errors
app.use((req, res, next) => { //doesn''t send response just adjusts it
res.header("Access-Control-Allow-Origin", "*") //* to give access to any origin
res.header(
"Access-Control-Allow-Headers",
"Origin, X-Requested-With, Content-Type, Accept, Authorization" //to give access to all the headers provided
);
if(req.method === ''OPTIONS''){
res.header(''Access-Control-Allow-Methods'', ''PUT, POST, PATCH, DELETE, GET''); //to give access to all the methods provided
return res.status(200).json({});
}
next(); //so that other routes can take over
})
Si desea que sea específico para el controlador, puede utilizar:
res.setHeader(''X-Frame-Options'', ''ALLOWALL'');
res.setHeader(''Access-Control-Allow-Origin'', ''*'');
res.setHeader(''Access-Control-Allow-Methods'', ''POST, GET'');
res.setHeader(''Access-Control-Allow-Headers'', ''Origin, X-Requested-With, Content-Type, Accept'');
Tenga en cuenta que esto también permitirá iframes.
Usar Express Middleware funciona muy bien para mí. Si ya está utilizando Express, simplemente agregue las siguientes reglas de middleware. Debería empezar a funcionar.
app.all("/api/*", function(req, res, next) {
res.header("Access-Control-Allow-Origin", "*");
res.header("Access-Control-Allow-Headers", "Cache-Control, Pragma, Origin, Authorization, Content-Type, X-Requested-With");
res.header("Access-Control-Allow-Methods", "GET, PUT, POST");
return next();
});
app.all("/api/*", function(req, res, next) {
if (req.method.toLowerCase() !== "options") {
return next();
}
return res.send(204);
});
Utilicé los siguientes pasos para mi aplicación web y tuve éxito:
Agregue el paquete de cors al expreso:
npm install cors --save
Añade las siguientes líneas después de la configuración de bodyParser . Tuve algunos problemas añadiendo antes de bodyParser:
// enable cors to the server
const corsOpt = {
origin: process.env.CORS_ALLOW_ORIGIN || ''*'', // this work well to configure origin url in the server
methods: [''GET'', ''PUT'', ''POST'', ''DELETE'', ''OPTIONS''], // to works well with web app, OPTIONS is required
allowedHeaders: [''Content-Type'', ''Authorization''] // allow json and token in the headers
};
app.use(cors(corsOpt)); // cors for all the routes of the application
app.options(''*'', cors(corsOpt)); // automatic cors gen for HTTP verbs in all routes, This can be redundant but I kept to be sure that will always work.
hacer
npm install cors --save
y simplemente agregue estas líneas en su archivo principal a donde va su solicitud.
const cors = require(''cors'');
const express = require(''express'');
let app = express();
app.use(cors());
app.options(''*'', cors());