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写接口

在 Node.js Express.js 服务器中添加标头后,Chrome 中仍然出现 CORS 错误

使用 cors、express 和 google api 的 Node.js 服务器应用程序在 Azure 部署后无法正常工作