2012-04-09 2 views
11

로컬 PC에 앱을 개발 중입니다. 프론트 엔드는 spinej 및 backend-api로 node.js로 빌드해야합니다. 척추 포트 9294과 Node.js를 실행되고 난 다음 내 모델에 추가 한 척추에 포트 3000 에서 실행 :spine, node.js (express) 및 Access-Control-Allow-Origin

@url: "http:localhost:3000/posts" 

내 특급 서버

app.get('/posts', function(req, res){ 
    console.log("giving ALL the posts"); 
    res.header("Access-Control-Allow-Origin", "*") 
    res.json(posts); 
}); 

그러나 난 항상 크롬에서 다음 에로 받고 있어요 :

XMLHttpRequest cannot load http://localhost:3000/posts. Origin http://localhost:9294 is not allowed by Access-Control-Allow-Origin. 

는 내가 제대로 내 API에 액세스 할 수 있는지 무엇을해야 하는가? 응답 헤더를 추가해도 문제가 해결됩니다.

+1

당신이 헤더가 참으로 설정되고 있음을 확인하는 응답 헤더를 검사 적이 : 자원 참조 ? 또한 jQuery는 'OPTIONS'HTTP 명령을 사용하여 사전 인증을 감지합니다. 익스프레스가 해당 HTTP 동사에도 응답하는지 확인하십시오. – tkone

+0

솔직히 내 요청이 내 node.js 서버에 도달하지 않는 것으로 보입니다. 클라이언트에 아무것도 보내기 전에 app.get()에 디버그 문을 추가했습니다. URL을 통해 직접 내 API에 액세스 할 때 문을 볼 수 있지만 척추를 통해 액세스 할 때 – soupdiver

+0

당신은 챨스와 같은 것을 사용해야합니다. 우리는 여기서 x 톤의 도메인 물건을 처리하며 헤더가 설정되지 않는다는 것을 알기 전까지는 좌절감을 느낍니다. – tkone

답변

16

app.getGET 요청에만 응답합니다. 브라우저가 OPTIONS 요청으로 프리 플라이트하는 경우 express는 요청에 대한 리스너가 없으므로 오류를 보냅니다. 그렇게된다면 당신 외에 추가로이 코드를 추가 시도하고 참조 : 또한

app.options('/posts', function(req, res){ 
    console.log("writing headers only"); 
    res.header("Access-Control-Allow-Origin", "*"); 
    res.end(''); 
}); 

주의 : 당신이 요청 (withcredentials=true), 다음 Access-Control-Allow-Origin 헤더 * 수 없습니다와 함께 쿠키를 전송하는 경우, 그것은 정확한해야합니다 브라우저가 자동으로 그렇게 같은 Ajax 요청에 추가하는 Origin 헤더 값 :

res.header("Access-Control-Allow-Origin", req.headers.origin); 

이 보안상의 이유로 - 당신은 쿠키를 필요로 일을하고 있다면, 당신이 원하는 가능성이 높습니다 실제로 origin이 허용되는지 확인하십시오. CSRF attacks을 피하기 위해

+0

고마워! 나는 화면에 OPTIONS 메소드를 가지고 있지 않았다 .... 지금 작업 중 :) – soupdiver

15

이 미들웨어는 Express를 사용하여 CORS를 허용하며 키는 프리 플라이트 요청 OPTIONS을 감지하고 404 또는 중복 데이터베이스 쿼리를 피하기 위해 응답을 반환합니다. http://cuppster.com/2012/04/10/cors-middleware-for-node-js-and-express/

var methodOverride = require('method-override'); 
app.use(methodOverride()); 

// ## CORS middleware 
// see: http://stackoverflow.com/questions/7067966/how-to-allow-cors-in-express-nodejs 
var allowCrossDomain = function(req, res, next) { 
    res.header('Access-Control-Allow-Origin', '*'); 
    res.header('Access-Control-Allow-Methods', 'GET,PUT,POST,DELETE'); 
    res.header('Access-Control-Allow-Headers', 'Content-Type, Authorization'); 

    // intercept OPTIONS method 
    if ('OPTIONS' == req.method) { 
     res.send(200); 
    } 
    else { 
     next(); 
    } 
}; 
app.use(allowCrossDomain); 
+1

마침내 실제로 작동하는 하나! 감사! –

+2

methodOverride는 더 이상 버전 4에서 Express와 번들로 제공되지 않으므로 package.json에 "method-override"를 포함시키고 app.use (express.methodOverride()) 대신'var methodOverride \t = 필요 ('method-override'); app.use (methodOverride());' –

관련 문제