Node.js服务器提供阻止跨源请求

我的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')); 

我正在使用一个离子2应用程序,使PUT调用端口3000上运行的Node.js服务器。当我的笔记本电脑上运行应用程序(使用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). 

据我可以告诉服务器代码设置为允许所有来源,但我得到这个错误仍然。

这是因为预检被触发,这意味着OPTIONS请求会到达您的服务器。 这在MDN的描述中得到了很好的解释,正如@johannes merz在你的问题的评论中指出的那样。

你可以指示你的服务器通过这样的代表来接受它:

 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(); }});