CORS表达不可预测

时间:2016-01-06 23:11:53

标签: node.js express cors

我试图允许从任何地方访问。

我尝试过使用app中间件:

app.use(function (req, res, next) {
  res.setHeader("Access-Control-Allow-Origin", "*");
  res.setHeader('Access-Control-Allow-Methods', '*');
  res.setHeader("Access-Control-Allow-Headers", "*");
  next();
});

我尝试过在路线中使用它:

app.post('/login',function(req,res){
var login   = req.body;
var sess    = req.session;

if (!login.email && !login.pwd){    
    return res.status(401);
}
res.header("Access-Control-Allow-Origin", '*');
res.header("Access-Control-Allow-Headers", '*');
.... more code here

两者都不起作用。我一直收到错误:“对预检请求的响应未通过访问控制检查:请求的资源上没有'Access-Control-Allow-Origin'标头。”

在服务器的下方,我们对另一条路线使用类似的代码:

app.post('/questar',function(req,res){
//allow xhr post from retireup domains
var cors = {
    origin= "https://www.website.com";
};
res.header("Access-Control-Allow-Origin", cors.origin);
res.header("Access-Control-Allow-Headers", "Origin, X-Requested-With, Content-Type, Accept");
res.type('application/json');

我无法区分代码,但只有一组有效。有什么想法吗?这似乎是一个不应该如此复杂的问题。感谢

6 个答案:

答案 0 :(得分:4)

在路线之前配置CORS内容,而不在其中。

在这里,像这样(来自enable-cors.org):

app.use(function(req, res, next) {
  res.header("Access-Control-Allow-Origin", "*");
  res.header("Access-Control-Allow-Headers", "Origin, X-Requested-With, Content-Type, Accept");
  next();
});

app.get('/', function(req, res, next) {
  // Handle the get for this route
});

app.post('/', function(req, res, next) {
 // Handle the post for this route
});

我总是在我的Express + Angular应用程序中将它配置为这样,它运行得很好。

希望它有所帮助。

答案 1 :(得分:3)

MDN 对服务器应如何响应Preflight Request的解释非常简短。

您可以通过处理HTTP OPTIONS方法来处理CORS预检请求(就像处理GET和POST方法一样)在处理同一路径上的其他请求方法之前:

app.options('/login', ...);
app.get('/login'. ...);
app.post('/login'. ...);

在您的情况下,它可能就像将app.use()调用更改为app.options()一样简单,将路由作为第一个参数传递,设置相应的标题,然后结束响应:

app.options('/login', function (req, res) {
  res.setHeader("Access-Control-Allow-Origin", "*");
  res.setHeader('Access-Control-Allow-Methods', '*');
  res.setHeader("Access-Control-Allow-Headers", "*");
  res.end();
});
app.post('/login', function (req, res) {
  ...
});

答案 2 :(得分:1)

按照其他人的回答,这对我有用:

mockery

答案 3 :(得分:1)

首先安装,来自npm的“cors”包:npm i -S cors

然后在您的快速服务器中启用它。

var express = require('express'),
  cors = require('cors');

const app = express();
app.use(cors());

...

答案 4 :(得分:0)

应用“ cors”中间件之后。您应该在“ localhost:”之前传递“ http://”。像这样通过Axios发送给url:

import testing.mysqld
from sqlalchemy import create_engine

# prevent generating brand new db every time.  Speeds up tests.
MYSQLD_FACTORY = testing.mysqld.MysqldFactory(cache_initialized_db=True, port=7531)


def tearDownModule():
    """Tear down databases after test script has run.
    https://docs.python.org/3/library/unittest.html#setupclass-and-teardownclass
    """
    MYSQLD_FACTORY.clear_cache()


class TestWhatever(unittest.TestCase):

    @classmethod
    def setUpClass(cls):
        cls.mysql = MYSQLD_FACTORY()
        cls.db_conn = create_engine(cls.mysql.url()).connect()

    def setUp(self):
        self.mysql.start()
        self.db_conn.execute("""CREATE TABLE `foo` (blah)""")

    def tearDown(self):
        self.db_conn.execute("DROP TABLE foo")

    @classmethod
    def tearDownClass(cls):
        cls.mysql.stop()  # from source code we can see this kills the pid

    def test_something(self):
        # something useful

答案 5 :(得分:0)

在遵循一些标准节点项目的情况下,在CORS配置下,对我而言始终有效。它需要npm软件包“ cors”。 注意:来源*表示启用对任何来源的响应并使用状态码200进行回复。如果需要将其限制为一个域,请相应地更新来源。例如:[来源:'http://exampleui.com']

var cors = require('cors');
var corsOptions = {
    origin: '*',
    optionsSuccessStatus: 200,
  }
app.use(cors(corsOptions));
app.use(express.json())