2012-04-09 3 views
11

私のローカルPCにアプリケーションを開発しています。フロントエンドはspinejで構築し、バックエンド-apiはnode.jsで構築する必要があります。 脊椎は、私は私のモデルに以下を追加しました脊椎内のポート3000 上で実行されているポート9294とのNode.js上で実行されている: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()にdebugステートメントを追加しました。 URL上で直接私のAPIにアクセスすると文を見ることができますが、背骨を使ってアクセスするときはアクセスしません – soupdiver

+0

あなたはこれが起こっていることを確認するためにcharlesのようなものを使うべきです。ここではxドメインのものを大量に扱っていますが、ヘッダーが設定されていないことがわかるまではイライラしています。 – tkone

答えて

16

app.getは、GETリクエストにのみ応答します。ブラウザが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

ありがとう!私は画面上のオプションのメソッドを持っていなかった....今働いて:) – 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

最後に、実際に動作する1つ!ありがとう! –

+2

methodOverrideはバージョン4以降はExpressにバンドルされていないので、package.jsonに "method-override"を含める必要があります。その後、 'app.use(express.methodOverride()) 'の代わりに' var methodOverride \t = require( 'method-override'); app.use(methodOverride()); ' –

関連する問題