web-dev-qa-db-fra.com

Comment activer cno nodejs avec express?

En résumé, j'utilise une visionneuse appelée pierre angulaire, comme l'API des fichiers DICOM. Pour cela, je me connecte au service WADO de Dc4chee afin d'obtenir le fichier DICOM. Dcm4chee exécute le port 8080 et mon application sur le noeud utilise le port 3000. Le dicom du navigateur.

https://www.npmjs.com/package/cornerstone-wado-image-loader

C'est l'erreur affichée par le navigateur

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.

Dans la documentation spécifiée

Notez que le serveur Web doit prendre en charge le partage de ressources inter-sources ou le chargement de l'image échouera. Si vous ne parvenez pas à activer CORS sur le serveur Web à partir duquel vous chargez des instances DICOM P10, vous pouvez utiliser un proxy inverse. Voici un simple Node.js basé sur http-proxy qui ajoute des en-têtes CORS qui pourraient vous être utiles.

Et montrer cet exemple de code mais j'utilise express et ce code ne fonctionne pas

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
});

Utilisez également npm cors ici le code

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')
})

Mais avec cela, j'active le cors sur le port 3000 et non le 8080, il me faut le mode pour activer ou ajouter 'Access-Control-Allow-Origin dans la réponse des en-têtes et non dans la demande d'en-tête,

Comment puis-je ajouter CORS sur le port 8080 où dcm4chee est exécuté à partir de NODEjs?

désolé pour mon anglais

mettre à jour!

Le serveur répond avec ce qui suit:

En-tête de réponse

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

DEMANDE EN-TÊTE

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

COMMENT ACTIVER LE CORS EN HEADER RESPONSE?

7
M. Node

faire

npm install cors --save

et ajoutez simplement ces lignes dans votre fichier principal où votre demande est dirigée.

const cors = require('cors');
const express = require('express');
let app = express();
app.use(cors());
app.options('*', cors());
8
Yatender Singh

Pour activer cors, vous pouvez faire ceci:

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'))
});

N'oubliez pas que les cors sont des intergiciels, vous voudrez donc avoir app.use avant afin que vos demandes entrantes passent par cors avant qu'elles ne rencontrent vos routes.

Vous pouvez modifier les ports en fonction de celui que vous souhaitez utiliser. Je suis presque sûr que vous pouvez également remplacer le || par && pour écouter sur plusieurs ports et définir des cors sur ceux-ci. 

Dans le noeud brut, je pense que vous devez utiliser writeHead, mais je ne suis pas sûr de la mise en œuvre du noeud brut. 

4
JonathanMitchell

L'erreur affichée par le navigateur signifie que serveur localhost: 8080 a refusé une demande de localhost: 3000, il semble que cors ne se soit pas bien défini sur le serveur localhost: 8080.

L'en-tête de réponse devrait avoir quelque chose comme ceci:

Access-Control-Allow-Headers:Content-Type,Content-Length, Authorization, Accept,X-Requested-With
Access-Control-Allow-Methods:PUT,POST,GET,DELETE,OPTIONS
Access-Control-Allow-Origin:*

Essayez d’ajouter l’en-tête cors sur votre serveur 8080.

app.all('*', function (req, res) {
    res.header("Access-Control-Allow-Origin", "*");
  res.header("Access-Control-Allow-Headers", "Content-Type,Content-Length, Authorization, Accept,X-Requested-With");
  res.header("Access-Control-Allow-Methods", "PUT,POST,GET,DELETE,OPTIONS");
//...
2
cxxsn

Ajouter CORS (Partage de ressources entre origines croisées) à votre nœud, l'application Express est assez simple ...

Vous devez installer cors library via npm first en utilisant la commande ci-dessous:

npm install cors -S

et si vous en avez besoin globalement , ajoutez-y simplement le drapeau -g ...

Ensuite, dans votre application express , procédez comme suit:

const express = require('express');
const cors = require('cors');
const app = express();
app.use(cors());

Voici aussi d'autres exemples de cors de leur doc:

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')
})

Configuration de CORS de manière asynchrone:

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')
})
0
Alireza