【发布时间】: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”