2011-09-29 15 views
4

これは厄介な問題です。この問題を抱えているのはIEだとは限りません。基本的に私はNode.jsサーバーを持っています。そこから、いくつかのJSONデータを表示するためにクロスドメイン呼び出しを行っています。Node.JS(expressを使用)のクロスドメインjQuery.getJSONがInternet Explorerで動作しません

これはJSONPコールである必要があり、URLでコールバックを行います。私は確信していないことは、これを行う方法ですか?

だから、ウェブサイト(domainA.com)は(すべては、Firefox 3で正常に動作します)このようなJSスクリプトでHTMLページがあります。

<script type="text/javascript"> 
    var jsonName = 'ABC' 
    var url = 'http://domainB.com:8080/stream/aires/' //The JSON data to get 
    jQuery.getJSON(url+jsonName, function(json){     
     // parse the JSON data 
     var data = [], header, comment = /^#/, x;      
     jQuery.each(json.RESULT.ROWS,function(i,tweet){ ..... } 
    } 
    ...... 
</script> 

今私のNode.jsサーバーは非常に簡単です(私は」 mをエクスプレスで使用):

var app = require('express').createServer(); 
var express = require('express'); 
app.listen(3000); 

app.get('/stream/aires/:id', function(req, res){ 
    request('http://'+options.host+':'+options.port+options.path, function (error, response, body) { 
     if (!error && response.statusCode == 200) { 
      console.log(body); // Print the google web page. 
     res.writeHead(200, { 
      'Content-Type': 'application/json', 
       'Cache-Control': 'no-cache', 
      'Connection': 'keep-alive', 
       'Access-Control-Allow-Origin': '*', 
      'Access-Control-Allow-Credentials': 'true' 
     }); 

      res.end(JSON.stringify(JSON.parse(body))); 
     } 
     }) 
    }); 

IEでクロスドメインGETを使用するにはどうすればこれらを変更できますか?私はインターネットを探していて、jQuery.support.cors = true;のようないくつかの違いがあるようです。また、長い回避策がたくさんあるようです。

私はこのタイプのもので見つけることができた実際の理想的なデザインパターンはありません。

私はWebページとクロスドメインWebサービスの両方を制御しているので、FireFox、Opera、ChromeなどのすべてのIEバージョンでの互換性を保証するための最良の変更は何ですか?

乾杯!

+0

http://stackoverflow.com/questions/3362474/jquery- ajax-cross-domain-calls-of-cross-domain-calls –

+0

ありがとう、すでにこれを知っているので、私の質問はJSONPの使い方ですか?その質問でJSONPは使用されませんでした... – NightWolf

+0

申し訳ありませんが、そのビットを逃した。この方法についてはhttp://www.giantflyingsaucer.com/blog/?p=2682をご覧ください。 'jsonp'と' jsonpCallback'プロパティを使います。サーバー側のコードでは、これらのパラメータを読み込み、データの周りに関数呼び出しをラップする必要があります。 –

答えて

8

私たちが管理しているmyServer.comとcrossDomainServer.comという2つのサーバーがあるとします。

最初にそのクライアントがcrossDomainServer.comにJSONPリクエストを行う必要がある、我々はmyServer.comのクライアントがcrossDomainServer.comからいくつかのデータを引き出したいと仮定:クロスドメイン・サーバーの私たちで

// client-side JS from myServer.com 
// script tag gets around cross-domain security issues 
var script = document.createElement('script'); 
script.src = 'http://crossDomainServer.com/getJSONPResponse'; 
document.body.appendChild(script); // triggers a GET request   

我々はJSONP応答を解析するためにグローバルな機能を必要とする当社のクライアント側のJSに続いて

// in the express app for crossDomainServer.com 
app.get('/getJSONPResponse', function(req, res) { 
    res.writeHead(200, {'Content-Type': 'application/javascript'}); 
    res.end("__parseJSONPResponse(" + JSON.stringify('some data') + ");"); 
});  

:このGETリクエストを処理する必要が

// gets called when cross-domain server responds 
function __parseJSONPResponse(data) { 
    // now you have access to your data 
} 

さまざまなブラウザでうまく機能し、IE 6が含まれています。

+0

これは素晴らしい作品です。 greasemonkeyユーザのための[link](http://stackoverflow.com/questions/15180049/parse-jsonp-response-from-express-js-server-clientside-using-greasemonkey)です。 –

0

次のコード(Expressを使用して)GETリクエストを処理する方法を示し、与えられたコールバックを使用して、JSON応答をラップする方法:

app.get('/foo', function(req, res){ 
    res.header('Content-Type', 'application/json'); 
    res.header('Charset', 'utf-8') 
    res.send(req.query.callback + '({"something": "rather", "more": "pork", "tua": "tara"});'); 
}); 
+2

content-typeは "application/javascript"でなければなりませんか? (JSONPはJavaScriptとして送信されるため動作します)。 –

関連する問題