node.js의 express.js 프레임 워크에서 교차 출처 리소스 공유 (CORS)를 활성화하는 방법


101

나는 크로스 도메인 스크립팅을 지원하는 node.js에서 웹 서버를 구축하는 동시에 공개 디렉토리에서 정적 파일을 제공하려고합니다. express.js를 사용하고 있으며 교차 도메인 스크립팅 ( Access-Control-Allow-Origin: *) 을 허용하는 방법을 잘 모르겠습니다 .

이 게시물을 보았지만 도움이되지 않았습니다.

var express = require('express')
  , app = express.createServer();

app.get('/', function (req, res, next) {
    res.header("Access-Control-Allow-Origin", "*");
    res.header("Access-Control-Allow-Headers", "X-Requested-With");
    next();
});

app.configure(function () {
    app.use(express.methodOverride());
    app.use(express.bodyParser());
    app.use(app.router);
});

app.configure('development', function () {

    app.use(express.static(__dirname + '/public'));
    app.use(express.errorHandler({ dumpExceptions: true, showStack: true }));
});

app.configure('production', function () {


    var oneYear = 31557600000;
    //    app.use(express.static(__dirname + '/public', { maxAge: oneYear }));
    app.use(express.static(__dirname + '/public'));
    app.use(express.errorHandler());
});

app.listen(8888);
console.log('express running at http://localhost:%d', 8888);

app.all과 app.get을 확인하십시오. GET이 아닌 OPTIONS 요청입니다
Shimon Doodkin 2012

참조 로컬 웹 서버 CORS 지원 노드 간단한 정적 웹 서버의 예
로이드

추가 정보를 원하시면 enable-cors.org/server_apache.html 참조
모스 타파

답변:


159

enable-cors.org에서 예제를 확인하십시오 .

node.js의 ExpressJS 앱에서 경로로 다음을 수행하십시오.

app.all('/', function(req, res, next) {
  res.header("Access-Control-Allow-Origin", "*");
  res.header("Access-Control-Allow-Headers", "X-Requested-With");
  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
});

첫 번째 호출 ( app.all)은 앱의 다른 모든 경로 (또는 최소한 CORS를 활성화하려는 경로)보다 먼저 이루어져야합니다.

[편집하다]

헤더가 정적 파일에도 표시되도록하려면 다음을 시도하십시오 (다음을 호출하기 전에 있는지 확인) use(express.static()).

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

코드로 이것을 테스트하고 public디렉토리 에서 자산에 대한 헤더를 얻었습니다 .

var express = require('express')
  , app = express.createServer();

app.configure(function () {
    app.use(express.methodOverride());
    app.use(express.bodyParser());
    app.use(function(req, res, next) {
      res.header("Access-Control-Allow-Origin", "*");
      res.header("Access-Control-Allow-Headers", "X-Requested-With");
      next();
    });
    app.use(app.router);
});

app.configure('development', function () {
    app.use(express.static(__dirname + '/public'));
    app.use(express.errorHandler({ dumpExceptions: true, showStack: true }));
});

app.configure('production', function () {
    app.use(express.static(__dirname + '/public'));
    app.use(express.errorHandler());
});

app.listen(8888);
console.log('express running at http://localhost:%d', 8888);

물론 함수를 모듈로 패키징하여 다음과 같은 작업을 수행 할 수 있습니다.

// cors.js

module.exports = function() {
  return function(req, res, next) {
    res.header("Access-Control-Allow-Origin", "*");
    res.header("Access-Control-Allow-Headers", "X-Requested-With");
    next();
  };
}

// server.js

cors = require('./cors');
app.use(cors());

응답 해 주셔서 감사합니다. 나는 당신이 제안한 것을 수행했습니다 (첫 번째 부분이지만 여전히 요청 헤더에 차이가 없음) 위의 현재 코드를 첨부했습니다. 나머지 솔루션을 여기에 통합하는 방법을 설명해 주시겠습니까?
Guy

1
나는 것을 놀랐어요 당신이있어 이후 use보내고 app.router전에 express.static이 정적 파일에 대한 헤더를 수정하지 않습니다; 어쨌든 작동하도록 내 답변을 업데이트했습니다.
Michelle Tilley

감사! 나는 당신이 옳다는 것을 압니다. 서버에서 가져 오는 자산은 요청 된 헤더와 함께 있습니다. 내 실제 문제에 대해 명확하지 않았을 수 있습니다. get 명령을 사용하여 외부 서버에 대한 API 호출을 시도하고 있습니다. XMLHttpRequest cannot load SOMEURL.com 오류가 발생 합니다. Origin localhost : 8888 은 Access-Control-Allow-Origin에서 허용되지 않습니다.
Guy

오해 할 수 있습니다. SOMEURL.com의 서버를 제어하고 있습니까?
Michelle Tilley

죄송합니다. 이제 귀하의 답변을 완전히 이해했습니다. 감사합니다. 도와 주셔서 감사합니다 :)
Guy

58

@Michelle Tilley 솔루션에 따라 처음에는 저에게 효과적이지 않았습니다. 왜 그런지 모르겠지만 크롬과 다른 버전의 노드를 사용하고 있습니다. 약간의 조정을 한 후 지금은 저에게 효과적입니다.

app.all('*', function(req, res, next) {
  res.header('Access-Control-Allow-Origin', '*');
  res.header('Access-Control-Allow-Methods', 'PUT, GET, POST, DELETE, OPTIONS');
  res.header('Access-Control-Allow-Headers', 'Content-Type');
  next();
});

누군가 나와 비슷한 문제에 직면 한 경우 도움이 될 수 있습니다.


app.all과 app.get을 확인하십시오. GET이 아닌 OPTIONS 요청입니다
Shimon Doodkin 2011

이것은 나를 위해 작동합니다 (Backbone을 사용하여 객체를 가져옵니다). 나는 그것이 IE 8에서 작동 할 것인지 알아 내려고 노력하고있다… 그래야만하는 것처럼 보이지만,이 "XDomainRequest"일에 특별한 것이 필요한지 모르겠다 ... developer.mozilla.org/en- US / docs / HTTP /…
Adam Loving

향후 사용자를위한 몇 가지 정보 : 도메인 이름을 heroku 저장소로 리디렉션하고 있으므로이 문제가 발생했습니다. 어쨌든 첫 번째 답변은 로컬에서 작동했지만 heroku에 푸시 한 후에는 작동하지 않았습니다. 그러나이 답변은 heroku를 밀고 나서 작동했습니다.
Kris Hollenbeck 2014-06-13

@KrisHollenbeck 이것은 heroku에서 나를 위해 작동하지 않습니다. 다른 일을 했습니까?
Ben Craig

@BenCraig, 아니요,하지만 첫 번째 시도 후 실제로 작동을 멈췄습니다. 그래서 나는 실제로 여전히이 문제를 겪고 있습니다.
Kris Hollenbeck 2014

11

cors npm 모듈을 시도하십시오 .

var cors = require('cors')

var app = express()
app.use(cors())

이 모듈은 도메인 화이트 리스팅, 특정 API에 대한 cors 활성화 등과 같은 cors 설정을 미세 조정하는 많은 기능을 제공합니다.


2

나는 이것을 사용한다 :

var app = express();

app
.use(function(req, res, next){
    res.header('Access-Control-Allow-Origin', '*');
    res.header('Access-Control-Allow-Headers', 'X-Requested-With');
    next();
})
.options('*', function(req, res, next){
    res.end();
})
;

h.readFiles('controllers').forEach(function(file){
  require('./controllers/' + file)(app);
})
;

app.listen(port);
console.log('server listening on port ' + port);

이 코드는 컨트롤러가 controllers 디렉토리에 있다고 가정합니다. 이 디렉토리의 각 파일은 다음과 같아야합니다.

module.exports = function(app){

    app.get('/', function(req, res, next){
        res.end('hi');
    });

}

1

cors express 모듈 사용을 권장 합니다. 이를 통해 도메인을 허용 목록에 추가하고 특정 경로에 대한 도메인을 허용 / 제한 할 수 있습니다.


0

Access-Control-Allow-Credentials: true"Credentials"를 통해 "cookie"를 사용 하려면을 설정해야합니다.

app.all('*', function(req, res, next) {
  res.header('Access-Control-Allow-Origin', '*');
  res.header('Access-Control-Allow-Credentials', true);
  res.header('Access-Control-Allow-Methods', 'PUT, GET, POST, DELETE, OPTIONS');
  res.header('Access-Control-Allow-Headers', 'Content-Type');
  next();
});

0
app.use(function(req, res, next) {
var allowedOrigins = [
  "http://localhost:4200"
];
var origin = req.headers.origin;
console.log(origin)
console.log(allowedOrigins.indexOf(origin) > -1)
// Website you wish to allow to
if (allowedOrigins.indexOf(origin) > -1) {
  res.setHeader("Access-Control-Allow-Origin", origin);
}

// res.setHeader("Access-Control-Allow-Origin", "http://localhost:4200");

// Request methods you wish to allow
res.setHeader(
  "Access-Control-Allow-Methods",
  "GET, POST, OPTIONS, PUT, PATCH, DELETE"
);

// Request headers you wish to allow
res.setHeader(
  "Access-Control-Allow-Headers",
  "X-Requested-With,content-type,Authorization"
);

// Set to true if you need the website to include cookies in the requests sent
// to the API (e.g. in case you use sessions)
res.setHeader("Access-Control-Allow-Credentials", true);

// Pass to next layer of middleware
next();

});

이 코드를 index.js 또는 server.js 파일에 추가하고 요구 사항에 따라 허용 된 원본 배열을 변경합니다.


당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.