Междоменный jQuery.getJSON с сервера Node.JS (с использованием экспресс) не работает в Internet Explorer - PullRequest
4 голосов
/ 29 сентября 2011

Это досадная проблема, и я не думаю, что эта проблема есть только у IE.В основном у меня есть сервер Node.js, с которого я делаю междоменные вызовы, чтобы получить некоторые данные JSON для отображения.

Это должен быть вызов JSONP, и я даю обратный вызов в URL.Я не уверен, как это сделать?

Итак, на сайте (domainA.com) есть HTML-страница с таким JS-скриптом (все отлично работает в Firefox 3):

<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 очень прост (я использую экспресс):

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)));
         }
       })
    });

Как я могу изменить эти два, чтобы они работали с междоменным GET в IE?Я искал в Интернете, и, кажется, есть несколько разных вещей, как jQuery.support.cors = true;, который не работает.Там также, кажется, много длинных обходных путей.

Не существует настоящего «идеального» шаблона проектирования, который я смог найти для такого типа вещей.

Поскольку я контролирую как веб-страницу, так и междоменную веб-службу, которую я отправляю, как лучше всего внести изменения, чтобы обеспечить совместимость со всеми версиями IE, а также с FireFox, Opera, Chrome и т. Д.?

Ура!

Ответы [ 2 ]

8 голосов
/ 30 сентября 2011

Скажем, у нас есть два сервера, myServer.com и crossDomainServer.com, оба из которых мы контролируем.

Предполагая, что мы хотим, чтобы клиент myServer.com извлекал некоторые данные из crossDomainServer.com, сначала клиент должен сделать запрос JSONP для 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        

На перекресткесервер домена нам нужно обработать этот запрос GET:

// 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') + ");");  
});    

Затем в нашем клиентском JS нам нужна глобальная функция для анализа ответа JSONP:

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

Хорошо работает во всехширокий выбор браузеров, включая IE 6.

0 голосов
/ 09 сентября 2012

В следующем коде показано, как обрабатывать запрос 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"});'); 
});
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...