Node.js + express + cors 不工作:待处理的选项请求
Posted
技术标签:
【中文标题】Node.js + express + cors 不工作:待处理的选项请求【英文标题】:Node.js + express + cors not working: pending options requests 【发布时间】:2018-03-26 08:08:13 【问题描述】:我尝试了大约 10 种不同的选项,但我无法让我的 POST 请求开始工作,而是我有选项请求正在等待并且永远不会完成
server.js
var express = require('express');
var path = require('path');
var mongoose = require('mongoose');
var bodyParser = require('body-parser');
var cors = require('cors');
var app = express();
app.use(cors());
var allowCrossDomain = function(req, res, next)
res.header('Access-Control-Allow-Origin', '*');
res.header('Access-Control-Allow-Methods', 'GET,PUT,POST,DELETE,OPTIONS');
res.header('Access-Control-Allow-Headers', 'Content-Type, Authorization, Content-Length, X-Requested-With, Accept');
// intercept OPTIONS method
if ('OPTIONS' == req.method)
res.send(200);
else
next();
;
app.use(allowCrossDomain);
app.options('*', cors());
app.use(require('./routes/order-templates.js'));
app.use(require('./routes/statuses.js'));
app.use(require('./routes/fields.js'));
app.use(require('./routes/users.js'));
app.use(require('./routes/groups.js'));
app.use(require('./routes/upload.js'));
app.use(require('./routes/feedback.js'));
app.use(require('./routes/order.js'));
app.use(express.static('public'));
var mongoDB = 'mongodb://localhost/ior';
mongoose.connect(mongoDB,
useMongoClient: true
);
app.get('*', function (request, response)
response.sendFile(path.resolve(__dirname, 'public', 'index.html'))
)
app.listen(3000, function ()
console.log('Fired at ' + Date());
);
users.js
var express = require('express');
var router = express.Router();
var User = require('../model/user.js');
var bodyParser = require('body-parser');
var app = express();
var cors = require('cors')
var corsOptions =
origin: 'http://188.225.82.166:3000/',
optionsSuccessStatus: 200
app.use(cors())
app.use(bodyParser.json());
app.options('/users/auth/', cors(corsOptions))
app.post('/users/auth/', cors(), function (req, res, next)
User.findOne("mail": req.body.mail, "password": req.body.password, function (err, user)
if (err) throw err;
if (user == undefined)
res.send("result": "error" )
res.sendStatus(200)
else
res.send("result": "ok", "_id": user._id, "type": user.type )
);
)
module.exports = app
如果我这样做了
app.use(cors());
app.use(function(req, res, next)
console.log('After CORS ' + req.method + ' ' + req.url);
next();
);
在 server.js 我得到了
After CORS GET /
After CORS GET /bundle.js
After CORS GET /bootstrap.css.map
After CORS GET /favicon.ico
在触发发布请求后,控制台中不会打印任何内容。 还值得一提的事实是,仅当我使用 ubuntu 部署到服务器时才存在问题。在 mac os 机器上本地一切都很好
【问题讨论】:
我看不出 OPTIONS 请求挂起的任何原因。您在server.js
顶部附近的行app.use(cors());
本身就足够了,您应该能够摆脱所有其他与CORS 相关的代码。如果您将server.js
的顶部更改为jsfiddle.net/fjL7oejo,您应该获取一些日志以查看发生了什么。 OPTIONS 请求应该只触发日志的第一位,其他请求应该同时触发。如果您仍然无法弄清楚问题出在哪里,那么当它失败时向我们展示您正在执行的请求可能会有所帮助。
用日志记录详细信息和一些附加信息更新了帖子
同样的问题在这里找不到任何解决方案。你成功了吗?
我记不太清了,我认为问题出在一些服务器设置上,在 cors 和 express 之外。
我在 MacOS 上使用 nodejs 和 express 4 有相反的问题。选项响应对 cors 很好,但对 POST 请求的后续响应不包括“Access-Control-Allow-Origin”
【参考方案1】:
您应该在 bodyParser 之前使用 cors 并允许它也用于 PUT/DELETE。
// Add cors
app.use(cors());
app.options('*', cors()); // enable pre-flight
app.use(bodyParser.json());
【讨论】:
【参考方案2】:它可能对像我这样的其他人有所帮助:
一开始我认为这是服务器端的问题,但后来 cors 错误的原因变成了我的前端。我将请求发送到localhost:3000/api
而不是http://localhost:3000/api
就是这样
【讨论】:
在这上面花了几个小时...谢谢。 很高兴我看到了这一点 - 这是您可以花费数小时尝试修复的“duh”错误之一【参考方案3】:对于像我这样为解决 POST cors 问题而挠头 2 小时的其他人,还请仔细检查您的 POST 请求的选项。
对我来说,这是 header: ... 的一个小错字,而不是 header(s): ... 在 POST 选项中,使用 cors 配置的快速服务器允许所有来源响应“Access-Control-Allow-Origin”受限错误。
【讨论】:
非常感谢,我找了好几个小时,这是我的问题...【参考方案4】:试试这个。在你的 user.js 文件中使用 router.post 而不是 app.post。
router.post('/users/auth/', cors(), function (req, res, next)
User.findOne("mail": req.body.mail, "password": req.body.password, function (err, user)
if (err) throw err;
if (user == undefined)
res.send("result": "error" )
res.sendStatus(200)
else
res.send("result": "ok", "_id": user._id, "type": user.type )
);
)
然后导出路由模块
module.exports = router;
我还建议在 server.js 文件中使用 bodyparser。所以你不需要在每个文件中都使用它。
【讨论】:
【参考方案5】:应用“cors”中间件后。您应该在“localhost:”之前附加“http://”。在网址中
axios.get("http://localhost:8080/api/getData")
.then(function (response)
this.items= response.data;
).catch(function (error)
console.log(error)
);
【讨论】:
以上是关于Node.js + express + cors 不工作:待处理的选项请求的主要内容,如果未能解决你的问题,请参考以下文章
在我的 express 中为 node.js 设置了 cors 但仍然给出关于 cors 的相同错误
在使用 node.js 和 Express 构建的 api 中使用 cors 中间件时出现 CORS 错误
允许对 express/node.js 应用程序的 CORS REST 请求
在 Node.js Express.js 服务器中添加标头后,Chrome 中仍然出现 CORS 错误
使用 cors、express 和 google api 的 Node.js 服务器应用程序在 Azure 部署后无法正常工作