【发布时间】:2020-08-16 06:34:47
【问题描述】:
我遇到了经典的 cors 问题,我无法解决。
CORS 策略已阻止从源“https://username.github.io”访问“xxx/current_user”处的 XMLHttpRequest:请求的资源上不存在“Access-Control-Allow-Origin”标头。
我显然在我的 Node.js 应用程序中安装了 cors 并使用了正确的标头。这是我的 index.js 的样子:
const express = require('express');
const cors = require('cors')
const mongoose = require('mongoose');
const bodyParser = require('body-parser');
const passport = require('passport');
const cookieSession = require('cookie-session');
const keys = require('./config/keys');
require('./models/user');
require('./services/passport');
mongoose.connect(keys.mongoUri, { useNewUrlParser: true })
const app = express();
app.use(cors())
app.use(bodyParser.json());
app.use(bodyParser.urlencoded({ extended: false }));
app.use(
cookieSession({
maxAge: 30 * 24 + 60 * 60 * 1000, //30 days
keys: [keys.cookieKey]
})
);
app.use(function (req, res, next) {
res.header("Access-Control-Allow-Origin", '*');
res.header("Access-Control-Allow-Credentials", true);
res.header('Access-Control-Allow-Methods', 'GET,PUT,POST,DELETE,OPTIONS');
res.header("Access-Control-Allow-Headers", 'Origin,X-Requested-With,Content-Type,Accept,content-type,application/json');
next();
});
app.use(passport.initialize());
app.use(passport.session());
//ROUTES
require('./routes/auth')(app);
require('./routes/game')(app);
const PORT = process.env.PORT || 5000;
app.listen(PORT);
我在我的 react 应用程序中对 API 的基本测试调用如下所示:
export const checkAuth = () => dispatch => {
axios.get('/current_user').then(res => {
if (res.data) {
}
}).catch(err => {
console.log({ err })
})
}
我是否遗漏了一些明显的东西?
current_user 路由代码
app.get('/current_user', (req, res) => {
res.send(req.user)
})
【问题讨论】:
-
您的服务器在哪里/如何配置?
-
@WillJenkins 然而 Heroku 正在这样做
-
为什么要手动向响应中添加标头?您正在使用
cors中间件库,并且您有固定值:创建一个corsOptions = {...}并将其传递给app.use(cors(corsOptions)),因此 cors 中间件对所有请求“正常工作”。而且您需要使用已清除站点的白名单:除非您想授予对整个互联网的访问权限,否则不要使用*O_o -
@Mike'Pomax'Kamermans 我这样做是因为将来源传递给 corsOptions 并没有解决任何问题,这就是我开始手动添加标题的原因。虽然没有解决任何问题,我希望整个互联网都可以访问它,但现在没有人可以
-
您将不得不显示更多代码:您正在显示 GET 代码,但出现一个关于预检失败的错误:GET 请求不使用预检,只有 POST 和相关动词可以,所以这几乎肯定不是触发错误的代码。您的网络标签显示什么?
标签: node.js reactjs heroku cors