CORS表示无法正常工作

Ell*_*iot 5 node.js cors express

我试图允许从任何地方访问。

我尝试使用应用中间件:

app.use(function (req, res, next) {
  res.setHeader("Access-Control-Allow-Origin", "*");
  res.setHeader('Access-Control-Allow-Methods', '*');
  res.setHeader("Access-Control-Allow-Headers", "*");
  next();
});
Run Code Online (Sandbox Code Playgroud)

我已尝试在路线中使用它:

app.post('/login',function(req,res){
var login   = req.body;
var sess    = req.session;

if (!login.email && !login.pwd){    
    return res.status(401);
}
res.header("Access-Control-Allow-Origin", '*');
res.header("Access-Control-Allow-Headers", '*');
.... more code here
Run Code Online (Sandbox Code Playgroud)

两者都不起作用。我不断收到错误消息:“对预检请求的响应未通过访问控制检查:所请求的资源上没有'Access-Control-Allow-Origin'标头。”

在服务器的更下方,我们对另一条路由使用了类似的代码,该代码有效:

app.post('/questar',function(req,res){
//allow xhr post from retireup domains
var cors = {
    origin= "https://www.website.com";
};
res.header("Access-Control-Allow-Origin", cors.origin);
res.header("Access-Control-Allow-Headers", "Origin, X-Requested-With, Content-Type, Accept");
res.type('application/json');
Run Code Online (Sandbox Code Playgroud)

我无法区分代码之间的区别,但是只有一套有效。有什么想法吗?这似乎是一个不应该太复杂的问题。谢谢

小智 17

应用“cors”中间件后。您应该在“localhost:”之前传递“http://”。在由 Axios 发送的 url 中,如下所示:

axios.get("http://localhost:8080/api/getData")
.then(function (response) {
this.items= response.data;
}).catch(function (error) {
console.log(error)
});
Run Code Online (Sandbox Code Playgroud)


Noc*_*rno 11

MDN对服务器应该如何响应Preflight Request有一个非常简短的解释。

处理同一路由上的其他请求方法之前,您可以通过处理 HTTP OPTIONS 方法(就像处理 GET 和 POST 方法一样)来处理 CORS 预检请求:

app.options('/login', ...);
app.get('/login'. ...);
app.post('/login'. ...);
Run Code Online (Sandbox Code Playgroud)

在您的情况下,它可能就像更改您的app.use()调用一样简单app.options(),将路由作为第一个参数传递,设置适当的标头,然后结束响应:

app.options('/login', function (req, res) {
  res.setHeader("Access-Control-Allow-Origin", "*");
  res.setHeader('Access-Control-Allow-Methods', '*');
  res.setHeader("Access-Control-Allow-Headers", "*");
  res.end();
});
app.post('/login', function (req, res) {
  ...
});
Run Code Online (Sandbox Code Playgroud)


小智 6

首先安装 npm 中的“cors”包:npm i -S cors

然后在您的 Express 服务器中启用它。

var express = require('express'),
  cors = require('cors');

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

...
Run Code Online (Sandbox Code Playgroud)

  • 是的,执行 `cors({origin: true})` 而不仅仅是 `cors()` (5认同)

小智 5

在路由之前(而不是在路由内部)配置CORS内容。

在这里,像这样(来自enable-cors.org):

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

app.get('/', function(req, res, next) {
  // Handle the get for this route
});

app.post('/', function(req, res, next) {
 // Handle the post for this route
});
Run Code Online (Sandbox Code Playgroud)

我总是在Express + Angular应用中像这样配置它,并且效果很好。

希望能帮助到你。