1

作業を古い環境から新しい環境に移行しています。古いコードを新しいコードで更新している途中で、うまく動作しているようです(node.jsで書かれた私のWebサービス)

node.js で Web サービスを実行し、サイトで jquery を使用しています。node.js コード

var express = require('express');
var app = express();

app.get('/', function(req, res){
    console.log('GET request to /');
});

app.listen(8888);
console.log('Express server started on port 8888');

ここに私のjqueryコードがあります

$.getJSON('http://URL:8888/getTables', function(data){
    //stuff
});

ただし、firebug では、コンソールに次のように表示されます。

"http://URL.com:8888/getTables 200 OK 64ms"

無反応で

「http://URL.com:8888/getTables」というサイトに直接アクセスすると、データが取得されます。

何が起こっているのですか?Web サービスを実行したままにして、何を話しているかを確認できるようにします。

それを使用しているサイトはhttp://www.URL.com/db/index.htmlです

編集:

  app.get('/getTables', function(req, res){
     console.log('GET request to /getTables');
     getTables(req, res);
     sendJSON(res, 200, cache_tables);
  });

function sendJSON(res, httpCode, body)
{
  var response = JSON.stringify(body);
  res.send(response, {'Access-Control-Allow-Origin': '*'}, httpCode);
}

アップデート

私の問題がクロスドメインであることを教えてくれてありがとう、私はsendJSONがそれを処理したと思っていましたが、nodejsとモジュールをアップグレードしているので、おそらく時代遅れになります。疑問に思っている人のための修正は次のとおりです。

//Middleware: Allows cross-domain requests (CORS)
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');
  next();
}

//App config
app.configure(function() {
  app.set('views', __dirname + '/views');
  app.set('view engine', 'jade');
  app.use(express.bodyParser());
  app.use(express.cookieParser());
  app.use(express.session({ secret: 'secret' }));
  app.use(express.methodOverride());
  app.use(allowCrossDomain);
  app.use(app.router);
  app.use(express.static(__dirname + '/public'));
});

そして、使用するすべての取得を更新する必要がありました:

 app.get('/', function(req, res, next){
   console.log('GET request to /');
 });
4

1 に答える 1

1

これは、サーバーを別のポートで実行しているため、x ドメインと見なされるためです。JSONPを使用するように設定できます

This SO questionはさらに詳しく説明します jQueryを使用して別のポートでAJAXリクエストを送信するにはどうすればよいですか?

これは、COR に関する詳細を説明する別の投稿ですhttp://www.bennadel.com/blog/2327-Cross-Origin-Resource-Sharing-CORS-AJAX-Requests-Between-jQuery-And-Node-js.htm

[以下のコメントの更新]

Express を使用して jsonp を提供するための設定例を含む投稿を見つけました。これが役立つことを願っています...

http://kiwidev.wordpress.com/2011/07/18/node-js-expressjs-and-jsonp-example/

その投稿のコード例は以下のとおりです。

エクスプレスアプリ

var express = require('express');

var app = module.exports = express.createServer();

app.configure(function(){
    app.set('views', __dirname + '/views');
    app.set('view engine', 'jade');
    app.use(express.bodyParser());
    app.use(express.methodOverride());
    app.use(app.router);
    app.use(express.static(__dirname + '/public'));
});

app.get('/logget', function(req, res){
    console.log('get to log');
    console.log(req.query.callback);
    console.log(req.param('somedata'))

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

app.listen(3000);
console.log("Express server listening on port %d in %s mode", app.address().port, app.settings.env);

それにアクセスする HTML ページ

<html>
    <head>
        <title>jsonp test</title>
        <script src="http://code.jquery.com/jquery-1.6.2.min.js"></script>      
        <script type="text/javascript">
            $(function(){               
                $('#jsonThingLink').click(function(e){
                    e.preventDefault();
                    console.log('jsonThingLink clicked');                   

                     $.ajax({
                        dataType: 'jsonp',
                        data: "somedata=blahblah",                      
                        jsonp: 'callback',
                        url: 'http://localhost:3000/logget?callback=?',                     
                        success: function(data) {
                            console.log('success');
                            console.log(data);
                            console.log(data.more);                
                        }
                    });
                });             
            });
        </script>
    </head>
    <body>
        <div id="jsonThing"><a href="#" id="jsonThingLink">test jsonp</a></div>    
    </body>
</html>
于 2012-12-01T04:27:16.190 に答える