Javascript 如何使用 express 启用 cors nodejs?

声明:本页面是StackOverFlow热门问题的中英对照翻译,遵循CC BY-SA 4.0协议,如果您需要使用它,必须同样遵循CC BY-SA许可,注明原文地址和作者信息,同时你必须将它归于原作者(不是我):StackOverFlow 原文地址: http://stackoverflow.com/questions/43150051/
Warning: these are provided under cc-by-sa 4.0 license. You are free to use/share it, But you must attribute it to the original authors (not me): StackOverFlow

提示:将鼠标放在中文语句上可以显示对应的英文。显示中英文
时间:2020-08-23 01:42:28  来源:igfitidea点击:

How to enable cors nodejs with express?

javascriptnode.jsexpresscorsdicom

提问by M. Node

In summary I am using a viewer like api of dicom files called cornerstone, for this I connect to the WADO service of dc4chee to get the dicom, dcm4chee runs port 8080, and my application on node uses port 3000, so I am trying to show The browser's dicom.

总之,我正在使用称为基石的 dicom 文件的 api 之类的查看器,为此我连接到 dc4chee 的 WADO 服务以获取 dicom,dcm4chee 运行端口 8080,而我在节点上的应用程序使用端口 3000,因此我试图显示浏览器的 dicom。

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

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

This is the error displayed by the browser

这是浏览器显示的错误

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.

In the documentation specified

在指定的文档中

Note that the web server must support Cross source resource sharing or the image will fail to load. If you are unable to get CORS enabled on the web server you are loading DICOM P10 instances from, you can use a reverse proxy. Here's a simple Node.js based on http-proxy that adds CORS headers that you might find useful.

注意web服务器必须支持跨源资源共享,否则图片加载失败。如果您无法在从中加载 DICOM P10 实例的 Web 服务器上启用 CORS,则可以使用反向代理。这是一个基于 http-proxy 的简单 Node.js,它添加​​了您可能会觉得有用的 CORS 标头。

And show this example code but I'm using express and this code does not work

并显示此示例代码,但我正在使用 express 并且此代码不起作用

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

Also use npm cors here the code

也在这里使用 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')
})

But with this I enable the cors on port 3000 and not the 8080, I need the mode to activate or add 'Access-Control-Allow-Origin in headers response and not in header request,

但是有了这个,我在端口 3000 而不是 8080 上启用了 cors,我需要在标头响应中而不是在标头请求中激活或添加“Access-Control-Allow-Origin”的模式,

How can I do to add CORS on port 8080 where dcm4chee runs from NODEjs?

如何在 dcm4chee 从 NODEjs 运行的端口 8080 上添加 CORS?

sorry for my English

对不起我的英语不好

update!

更新!

The server responds with the following;

服务器响应如下;

RESPONDE HEADER

响应头

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

REQUEST HEADER

请求头

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

HOW TO ENABLE THE CORS IN RESPONSE HEADER??

如何在响应头中启用CORS??

回答by Yatender Singh

do

npm install cors --save

and just add these lines in your main file where your request is going.

并将这些行添加到您的请求所在的主文件中。

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

回答by JonathanMitchell

To enable cors you can do this:

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

Remember that cors are middleware, so you will want to have app.usebefore it so that your incoming requests will go through cors before they hit your routes.

请记住,cors 是中间件,因此您需要app.use在它之前拥有,以便您的传入请求在到达您的路由之前通过 cors。

You can change the ports depending on which one you want to use. I am pretty sure you can also replace the ||with &&to listen on multiple ports and set cors on those.

您可以根据要使用的端口更改端口。我很确定你也可以替换||with&&来监听多个端口并在这些端口上设置 cors。

In raw node, I believe you have to use the writeHead, but I am not sure about the raw node implementation.

在原始节点中,我相信您必须使用 writeHead,但我不确定原始节点的实现。

回答by Alireza

Adding CORS(Cross-Origin-Resource-Sharing)to your node, express app is quite easy...

CORS(Cross-Origin-Resource-Sharing) 添加到您的节点,express 应用程序非常容易...

You need to install corslibrary via npmfirst, using the command below:

您需要先通过npm安装cors库,使用以下命令:

npm install cors -S

and if you need it globally, just add -gflag to it...

如果您在全球范围内需要它,只需-g为其添加标志...

Then in your express app, do this:

然后在您的express 应用程序中,执行以下操作:

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

Also these are other examples for cors from their doc:

这些也是他们文档中 cors 的其他示例:

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

Configuring CORS Asynchronously:

异步配置 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')
})

回答by cxxsn

The error displayed by the browser means, server localhost:8080 refused a request from localhost:3000, It seems cors didn't set well on server localhost:8080.

浏览器显示的错误是,server localhost:8080 拒绝了来自localhost:3000 的请求,看来cors 在server localhost:8080 上没有设置好。

The response header should have something like this:

响应头应该是这样的:

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

Try add cors header in your 8080 server.

尝试在您的 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");
//...