jQuery的getJSON不响应,但直接访问
我将我的工作从旧环境迁移到新环境。 我在更新过时的代码与更新的中间,它似乎运行良好(我的web服务写在node.js)
我有我的web服务运行在node.js和我的网站使用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 });
然而在萤火虫控制台显示:
"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); }
UPDATE
我发现我的解决scheme,感谢让我知道我的问题是跨域,我以为我的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 /'); });
这是因为你在另一个端口上运行服务器,所以它被认为是X域。 您可以将其设置为使用JSONP
这个问题进入更详细的问题如何发送一个AJAX请求在不同的端口与jQuery?
这里是另一篇文章,详细介绍了CORs http://www.bennadel.com/blog/2327-Cross-Origin-Resource-Sharing-CORS-AJAX-Requests-Between-jQuery-And-Node-js.htm
[下面的评论更新]
我发现一个post,有一个示例设置使用快递服务JSONP,希望这将有助于…
http://kiwidev.wordpress.com/2011/07/18/node-js-expressjs-and-jsonp-example/
该post的代码示例如下:
表示应用程序
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>