これまでにクロスドメインの対応をしたことはあったが、node.jsでは未経験でした。 PHPでは経験がり、サーバー側のレスポンスヘッダーへ以下を追加すればすぐにできるだろと思っていましたが、あまかった。苦戦したのでメモ。
Access-Control-Allow-Origin: *
クライスト側はangular.jsを利用しています。
■クライアント側
$http({ method: 'POST', url : http://localhost:3000/hoge, headers: { 'Content-Type': 'application/json' }, data: {"name" : "hoge", "text" : "hogehoge"}, }).success(function(data, status, headers, config) { console.log(JSON.stringify(data)); }).error(function(data, status, headers, config) { console.log("err"); });
■サーバー側
router.post('/hoge',function(request,response){ response.setHeader("Access-Control-Allow-Origin", "*"); response.json(request.body); return; });
angular.jsもあまり経験がなかったのでクライアント側の問題だと思い、
何度もangularの$httpを修正して調査した。
はじめは、「Request Method:OPTIONS」になっているこが問題だとPOSTになるよう修正していた。
angularをあきらめ、jQueryの$.ajaxを使っても解消されなかった。
そもそもそれが間違い
POSTするときのリクエストメッドは「Request Method:OPTIONS」でないといけなかった。
今までクロスドメインはGETしかしたことがなかった。POSTの経験はなかったことを今更気づく。
以下のサイトにGET以外は2往復するとのことです。
http://garafu.blogspot.jp/2013/07/blog-post.html
1.クライアントからサーバーへのリクエスト:Request Method:OPTIONS
2.サーバーからレスポンスが返ってきて許可がでる
3.クライアントからサーバーへのリクエスト:Request Method:POST
4.POSTの処理が完了してサーバーからレスポンス返ってくる
クライアンは問題がない。ではサーバーでOPTIONSをちゃんと受け付けて、許可するよういろいろ修正したが、解消されない
なんども検索してると以下のサイトで「npm install cors」して使えばOKとのことです。
http://itbose.hatenablog.com/entry/2015/01/21/134056
npm install cors
でインストールし以下を実装。
var express = require('express'); var cors = require('cors'); var app = express(); app.use(cors());
※最初に実装した「response.setHeader(“Access-Control-Allow-Origin”, “*”);」は削除しておく
やっとこれでできた。3日はまった。
・参考サイト
http://itbose.hatenablog.com/entry/2015/01/21/134056
http://garafu.blogspot.jp/2013/07/blog-post.html