¿Cómo habilitar cors nodejs con express?
En resumen estoy usando un visor como api de archivos dicom llamado cornerstone, para esto me conecto al servicio WADO de dc4chee para obtener el dicom, dcm4chee ejecuta el puerto 8080 y mi aplicación en el nodo usa el puerto 3000, así que estoy tratando de mostrar El dicom del navegador.
https://www.npmjs.com/package/cornerstone-wado-image-loader
Este es el error que muestra el navegador
XMLHttpRequest can not load http: // localhost: 8080 / wado? RequestType = WADO & studyUID = 1.2.840.113704.1.111.5 ... 26513.429 & contentType = application% 2Fdicom & transferSyntax = 1.2.840.10008.1.2. In 'Access-Control-Allow-Origin' header is present on the requested resource. Origin 'http: // localhost: 3000' is therefore not allowed access.
En la documentación especificada
Tenga en cuenta que el servidor web debe admitir el uso compartido de recursos entre fuentes o la imagen no se cargará. Si no puede habilitar CORS en el servidor web desde el que está cargando instancias DICOM P10, puede utilizar un proxy inverso. Aquí hay un Node.js simple basado en http-proxy que agrega encabezados CORS que pueden resultarle útiles.
Y muestro este código de ejemplo pero estoy usando express y este código no funciona
Var http = require ('http'),
HttpProxy = require ('http-proxy');
Var proxy = httpProxy.createProxyServer ({target: 'http: // localhost: 8042'}) .listen (8000);
Proxy.on ('proxyRes', function (proxyReq, req, res, options) {
// add the CORS header to the response
Res.setHeader ('Access-Control-Allow-Origin', '*');
});
Proxy.on ('error', function (e) {
// suppress errors
});
También use npm cors aquí el código
Var express = require ('express')
Var cors = require ('cors')
Var app = express ()
App.get ('/ products /: id', cors (), function (req, res, next) {
Res.json ({msg: 'This is CORS-enabled for a Single Route'))
})
App.listen (80, function () {
Console.log ('CORS-enabled web server listening on port 80')
})
Pero con esto habilito el cors en el puerto 3000 y no en el 8080, necesito que el modo se active o agregue 'Access-Control-Allow-Origin en la respuesta de los encabezados y no en la solicitud del encabezado,
¿Cómo puedo agregar CORS en el puerto 8080 donde se ejecuta dcm4chee desde NODEjs?
¡actualizar!
El servidor responde con lo siguiente;
ENCABEZADO DE RESPONDER
Content-Type:application/dicom
Date:Sat, 01 Apr 2017 01:15:38 GMT
Expires:0
Server:Apache-Coyote/1.1
Transfer-Encoding:chunked
X-Powered-By:Servlet 2.4; JBoss-4.2.3.GA (build: SVNTag=JBoss_4_2_3_GA
date=200807181439)/JBossWeb-2.0
ENCABEZADO DE SOLICITUD
Accept:*/*
Accept-Encoding:gzip, deflate, sdch, br
Accept-Language:es-ES,es;q=0.8,en-US;q=0.6,en;q=0.4
Connection:keep-alive
Host:localhost:8080
Origin:http: //localhost:3000
Referer:http: //localhost:3000/
User-Agent:Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like
Gecko) Chrome/55.0.2883.87 Safari/537.36
¿CÓMO HABILITAR EL CORS EN EL ENCABEZADO DE RESPUESTA?
hacer
npm install cors --save
y simplemente agregue estas líneas en su archivo principal donde va su solicitud.
const cors = require('cors');
const express = require('express');
const app = express();
app.use(cors());
Agregar CORS (Cross-Origin-Resource-Sharing) a su nodo, la aplicación express es bastante fácil...
Primero debe instalar la biblioteca cors a través de npm , usando el siguiente comando:
npm install cors -S
y si lo necesita globalmente , simplemente agréguele -g
una bandera...
Luego, en tu aplicación express , haz esto:
const express = require('express');
const cors = require('cors');
const app = express();
app.use(cors());
También estos son otros ejemplos de cors de su documento:
var express = require('express')
var cors = require('cors')
var app = express()
app.use(cors())
app.get('/products/:id', function (req, res, next) {
res.json({msg: 'This is CORS-enabled for all origins!'})
})
app.listen(80, function () {
console.log('CORS-enabled web server listening on port 80')
})
Configuración de CORS de forma asincrónica:
var express = require('express')
var cors = require('cors')
var app = express()
var whitelist = ['http://example1.com', 'http://example2.com']
var corsOptionsDelegate = function (req, callback) {
var corsOptions;
if (whitelist.indexOf(req.header('Origin')) !== -1) {
corsOptions = { origin: true } // reflect (enable) the requested origin in the CORS response
}else{
corsOptions = { origin: false } // disable CORS for this request
}
callback(null, corsOptions) // callback expects two parameters: error and options
}
app.get('/products/:id', cors(corsOptionsDelegate), function (req, res, next) {
res.json({msg: 'This is CORS-enabled for a whitelisted domain.'})
})
app.listen(80, function () {
console.log('CORS-enabled web server listening on port 80')
})
Para habilitar cors puedes hacer esto:
var cors = require('cors');
app.use(cors());
// to change your ports for different cors stuff:
app.set('port', process.env.PORT || 3000);
app.listen(app.get('port'), function() {
console.log('we are listening on: ',
app.get('port'))
});
Recuerde que los cors son middleware, por lo que querrá tenerlo app.use
antes para que sus solicitudes entrantes pasen por cors antes de que lleguen a sus rutas.
Puedes cambiar los puertos dependiendo de cuál quieras usar. Estoy bastante seguro de que también puedes reemplazar ||
with &&
para escuchar en múltiples puertos y configurar cors en ellos.
En el nodo sin formato, creo que debes usar writeHead, pero no estoy seguro de la implementación del nodo sin formato.