Node.js服务器出现了跨域请求阻止问题。

3
我的Node.js服务器代码在AWS实例上运行。代码如下:

var express = require('express');
var http = require('http');
var bodyParser = require('body-parser');
var logger = require('morgan');
var cors = require('cors');
var SuperLogin = require('superlogin');
 
var app = express();
app.set('port', process.env.PORT || 3000);
app.use(logger('dev'));
app.use(bodyParser.json());
app.use(bodyParser.urlencoded({ extended: false }));
app.use(cors());
 
app.use(function(req, res, next) {
   res.header("Access-Control-Allow-Origin", "*");
   res.header('Access-Control-Allow-Methods', 'DELETE, PUT');
   res.header("Access-Control-Allow-Headers", "Origin, X-Requested-With, Content-Type, Accept");
   next();
});
 
var config = {
  dbServer: {
    protocol: 'http://',
    host: 'localhost:5984',
    user: '',
    password: '',
    userDB: 'sl-users',
    couchAuthDB: '_users'
  },
  mailer: {
    fromEmail: 'gmail.user@gmail.com',
    options: {
      service: 'Gmail',
        auth: {
          user: 'gmail.user@gmail.com',
          pass: 'userpass'
        }
    }
  },
  security: {
    maxFailedLogins: 3,
    lockoutTime: 600,
    tokenLife: 86400,
    loginOnRegistration: true,
  },
  userDBs: {
    defaultDBs: {
      private: ['supertest']
    }
  },
  providers: { 
    local: true
  }
}
 
// Initialize SuperLogin 
var superlogin = new SuperLogin(config);
 
// Mount SuperLogin's routes to our app 
app.use('/auth', superlogin.router);
 
app.listen(app.get('port'));
console.log("App listening on " + app.get('port'));

我正在使用一个ionic 2应用程序,该应用程序向运行在端口3000上的Node.js服务器发出PUT调用。当在我的笔记本电脑上通过浏览器运行应用程序(使用ionic serve)时,PUT调用会导致CORS错误:

Cross-Origin Request Blocked: The Same Origin Policy disallows reading 
the remote resource at http://ec2-xx-xxx-xx-4xx.eu-central-1.compute.amazonaws.com/auth/login. 
(Reason: CORS header ‘Access-Control-Allow-Origin’ missing).

据我所知,服务器代码已经设置允许所有来源,但我仍然收到了这个错误信息。

你尝试过在Access-Control-Allow-Methods中添加“OPTIONS”吗?请参考https://developer.mozilla.org/en-US/docs/Web/HTTP/Access_control_CORS#Preflighted_requests - Johannes Merz
使用PUT将触发浏览器通过OPTIONS请求预检PUT请求。因此,除了支持PUT请求并返回适当的信息外,您还必须在服务器上支持OPTIONS请求。注意:请求中的某些其他条件也可以触发带有OPTIONS的预检,因此如果要使CORS正常工作,通常最好始终支持它。 - jfriend00
我不确定如何添加OPTIONS处理。 我正在使用的代码是现有的Node软件包。 - Bill Noble
1个回答

6
这是因为会触发预检,这意味着一个 OPTIONS 请求将会发送到服务器。@johannes merz 在你的问题评论中指出,在MDN 的描述中对此有详细解释。
你可以让你的服务器接受它,例如回复如下内容:
app.use(function(req, res, next) {
   res.header("Access-Control-Allow-Origin", "*");
   res.header('Access-Control-Allow-Methods', 'DELETE, PUT');
   res.header("Access-Control-Allow-Headers", "Origin, X-Requested-With, Content-Type, Accept");
   if ('OPTIONS' == req.method) {
      res.sendStatus(200);
    }
    else {
      next();
    }});

太棒了,Fab!谢谢。 - Bill Noble

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接