【问题标题】:Why my cors handling in express doesn't work?为什么我在快递中处理的 cors 不起作用?
【发布时间】:2019-12-04 14:52:39
【问题描述】:

我想使用 express 获取我的数据。代码如下:

const express = require('express');
const app = express();
const cors = require('cors');
require('dotenv/config');

// Middlewares
app.use(cors());
app.use(express.json());

// Routes
const postRouter = require('./routes/posts');
app.use('/posts', postRouter);

// Mongoose connect
const mongoose = require('mongoose');
mongoose.connect(
    process.env.DB_CONNECTION,
    { useNewUrlParser: true },
    () => console.log("You are connected to MongoDB")
);

// Port listen
app.listen(2998);

这些 node+express 代码使用 Postman 完美运行。

但是当我使用 javascript 获取时它总是显示 CORS 错误。这是JS代码:

let url = "https://localhost:2998/posts/"
    fetch(url)
    .then(result => {
        console.log(result);    
    })
    .then(data => {
        console.log("data: " + data)
    });

控制台说:

跨域请求被阻止:同源策略不允许读取位于https://localhost:2998/posts/ 的远程资源。 (原因:CORS 请求未成功)。

。 . . . .

已解决!它只是无法运行 https 协议,所以我需要将其更改为http://localhost/2998。不过,我不知道为什么会这样

【问题讨论】:

  • 你的 localhost 使用的是 https 协议?
  • 是的,https 有什么问题吗?反正我是新手,呵呵
  • 不,只是交叉验证,如果有帮助试试这个stackoverflow.com/questions/18310394/…
  • “已解决!它只是无法运行 https 协议”——这根本没有意义,因为您说使用邮递员时它可以工作。除非您更改了切换到 JS 时使用的 URL……这非常重要!

标签: node.js express cors


【解决方案1】:

我相信您没有设置CORS 选项。请尝试以下方法:

const express = require('express');
const app = express();
const cors = require('cors');
require('dotenv/config');

// CORS Options: But customise according to your needs
const options = {
    allowedHeaders: ["Origin", "Content-Type", "Accept", "Authorization"],
    methods: "GET,HEAD,OPTIONS,PUT,PATCH,POST,DELETE",
    origin: "*",
    preflightContinue: false
};

// Middlewares
app.use(cors(options));
app.use(express.json());

// Routes
const postRouter = require('./routes/posts');
app.use('/posts', postRouter);

// Mongoose connect
const mongoose = require('mongoose');
mongoose.connect(
    process.env.DB_CONNECTION,
    { useNewUrlParser: true },
    () => console.log("You are connected to MongoDB")
);

// Port listen
app.listen(2998);

【讨论】:

  • "allowedHeaders" — 他们不会发送任何这些的自定义版本。这不是必需的。
  • "credentials" — 他们没有发送凭据。这不是必需的。
  • "methods" — 他们正在发出 GET 请求,这是默认允许的。这不是必需的。
  • 好吧,我说,自定义as you need it.粘贴我的代码。如果您也需要限制标头,那么这不是一个糟糕的选择。我不明白反对票。
  • StackOverFlow 是一个知识共享平台,发布答案时,不一定要针对确切的问题。它旨在鼓励提出问题的人help 解决问题。所以,重点是,拥有allowedHeaderscredentials 并没有错,只是因为 OP 不需要它。它可能会帮助其他人在这里绊倒。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2020-01-19
  • 2017-01-19
  • 2022-01-03
  • 2017-12-25
  • 1970-01-01
  • 2020-07-02
  • 2010-12-20
相关资源
最近更新 更多