web-dev-qa-db-ja.com

ExpressでCORS Nodejsを有効にする方法は?

要約すると、コーナーストーンと呼ばれるdicomファイルのapiのようなビューアを使用しているため、dc4cheeのWADOサービスに接続してdicomを取得し、dcm4cheeはポート8080を実行し、ノード上のアプリケーションはポート3000を使用するため、表示しようとしていますブラウザのdicom。

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

これはブラウザに表示されるエラーです

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.

指定されたドキュメントで

Webサーバーはクロスソースリソース共有をサポートする必要があります。そうしないと、イメージのロードに失敗します。 DICOM P10インスタンスをロードするWebサーバーでCORSを有効にできない場合は、リバースプロキシを使用できます。これは、有用と思われるCORSヘッダーを追加するhttp-proxyに基づく単純なNode.jsです。

このサンプルコードを表示しますが、私はエクスプレスを使用していますが、このコードは機能しません

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

また、ここでコードをnpm corsを使用してください

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

しかし、これで8080ではなくポート3000でCORを有効にし、ヘッダー要求ではなくヘッダー応答で「Access-Control-Allow-Origin」をアクティブ化または追加するモードが必要です、

Dcm4cheeがNODEjsから実行されるポート8080にCORSを追加するにはどうすればよいですか?

私の英語すみません

更新!

サーバーは次のように応答します。

応答ヘッダー

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

リクエストヘッダー

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

応答ヘッダーでCORSを有効にする方法は?

8
M. Node

行う

npm install cors --save

リクエストが送信されるメインファイルにこれらの行を追加するだけです。

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

Corsを有効にするには、次のようにします。

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

Corsはミドルウェアであるため、着信要求がルートをヒットする前にcorsを通過するように、app.useを前に置く必要があります。

使用するポートに応じてポートを変更できます。 ||&&に置き換えて、複数のポートでリッスンし、それらにcorsを設定することもできます。

Rawノードでは、writeHeadを使用する必要があると思いますが、rawノードの実装についてはわかりません。

4

ブラウザに表示されるエラーは、サーバーlocalhost:8080がlocalhost:3000からの要求を拒否したことを意味します。サーバーlocalhost:8080でcorsが適切に設定されなかったようです。

応答ヘッダーには次のようなものが必要です。

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:*

8080サーバーにcorsヘッダーを追加してみてください。

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");
//...
3
cxxsn

CORS(Cross-Origin-Resource-Sharing)をノードに追加すると、エクスプレスアプリは非常に簡単です...

以下のコマンドを使用して、最初にnpmcorsライブラリをインストールする必要があります。

npm install cors -S

必要な場合はglobally、単に-gそれにフラグ...

次に、エクスプレスアプリで次の操作を行います。

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

また、これらはドキュメントからのCORの他の例です:

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

CORSの非同期設定:

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