Node.js をサーバーとして使用するクライアント アプリケーションをCappuccinoに実装したいと考えています。
私は現在Expressで Node を実行しています:
var express = require( 'express' );
var app = express();
app.get( '/an_endpoint', function(req, res){
res.send('Hello From Node Express!\n');
});
app.listen(1337);
これは次の方法で検証できます:
$ node hello_echo.js
$ curl http://127.0.0.1:1337/an_endpoint
> Hello From Node Express!
クライアント コードに関しては、これは単純な小さなアプリであり、クリックすると次のことを実行するボタンがあります。
// in did finish launching
[button setTitle:"Ping Node"];
[button setTarget:self];
[button setAction:@selector(doPing:)];
- (void)doPing:(id)sender
{
var connection = [CPURLConnection connectionWithRequest:[CPURLRequest requestWithURL:'http://127.0.0.1:1337/an_endpoint/'] delegate:self];
}
- (void)connection:(CPURLConnection) connection didReceiveData:(CPString)data
{
alert('Node Says: ' + data);
}
- (void)connection:(CPURLConnection)connection didFailWithError:(CPString)error
{
alert('Error: ' + error);
}
OS X の Google Chrome でアプリ ( from ) をロードしhttp://127.0.0.1:8080/NewApplication/index.html
てボタンをクリックすると、コンソールに次のエラーが表示されます。最初は後者が原因です。
OPTIONS http://127.0.0.1:1337/an_endpoint/ 404 (Not Found) Objective-J.js:716
XMLHttpRequest cannot load http://127.0.0.1:1337/an_endpoint/.
Origin http://127.0.0.1:8080 is not allowed by Access-Control-Allow-Origin.
これは明らかに、ノード サーバーが :1337 にあり、カプチーノ アプリが :8080 にあるという事実によるものです。これは、ポート部分のために技術的に異なるドメインです。
少し調べた結果、この投稿にたどり着きました。この投稿では、JSONP を使用してリモート スクリプトをアプリに挿入することを検討することを推奨しています。とても面倒くさいので、必要がなければそのルートには行かないようにしたいと思います。
では、私の質問は、Cappuccino と Node.js が調和して動作するようにするにはどうすればよいかということです。Cappuccino アプリにこの ( ) ヘッダーを使用するように指示できればheader("Access-Control-Allow-Origin", "*");
、すべて問題ないようですが、その方法がわかりません。Nodeにそのヘッダーを送信させてみましたが、何もしていないようです。