使用服务器端语言作为 Javascript 的 JSONP 调用
Posted
技术标签:
【中文标题】使用服务器端语言作为 Javascript 的 JSONP 调用【英文标题】:JSONP call with server-side language as Javascript 【发布时间】:2011-10-07 20:41:54 【问题描述】:我一直在尝试使用 JSONP 通过客户端调用(在不同的端口上)从服务器获取 JSON 对象。但是,因为我的服务器是使用 Node.js 和 Express 在 javascript 中实现的,所以我无法在服务器上使用 Javascript 的 JSONP 找到很多东西,因为我发现大多数网站都使用 php 作为服务器端代码。
我认为问题在于我如何设置与回调相关的 url,我对此有点模糊,因为它对我来说是新的。
在服务器上:
//Setting up server stuff
var express = require('express'),
app = express.createServer();
app.use(express.logger());
//Making a connection to the mongoDB to get the data that I want to display in the JSON object
new Db('prism',
new Server("127.0.0.1", 27017, auto_reconnect: false), ).open(function(err, db)
app.get('/getData', function(req, res)
console.log('JSONPCALLBACK CALLED WITH RETURNDATA PASSED IN; SERVER SIDE');
if (typeof callback == 'function')
console.log('callback is defined');
callback(returnData);
else
console.log('callback is not defined');
);
在客户端:
$.ajaxSetup( cache : false );
$.getJSON('http://127.0.0.1:1337/getData&callback=?', function(rtndata)
console.log('SUCCESS');
console.log(rtndata);
);
由标准标签嵌入。
但我得到了错误:
GET http://127.0.0.1:1337/getData&callback=jQuery16108897686484269798_1311007334273?_=1311007334342 404 (Not Found)
服务器在端口 1337 上,而客户端通过 localhost:8888 上的 MAMP 运行。我不确定它是否甚至是与本地主机相关的问题,因为我已经尝试让这个设置运行几天了。
我认为这个问题与没有将这一行(用 php 编写)写入我的服务器端 Javascript 中有关。我发现的大多数 JSONP 示例都有这样的内容。但我不确定。
if ($GET['callback'] != '')
$json = $GET['callback']."( $json )";
return $json;
任何帮助将不胜感激。我提前为过于冗长道歉。
最好的, 聪
【问题讨论】:
【参考方案1】:我认为你有两个问题。首先是 404。与让客户端 jQuery 代码工作完全不同,您需要确保可以发出常规浏览器请求(即粘贴该 URL)并返回您期望的内容。我没有使用 express,所以我很难评论为什么你会得到它,除了说我在你的服务器端代码中没有看到 1337,只是端口号 27017 .
第二个问题是您实际上并不想执行服务器上的回调,只需构建 JSON 响应,包括作为前缀的回调(字符串)。
所以不是这个...
if (typeof callback == 'function')
console.log('callback is defined');
callback(returnData);
else
console.log('callback is not defined');
试试这个:
if (callback)
console.log('callback is defined');
res.write(callback + '(' + JSON.stringify(returnData) + ')');
else
console.log('callback is not defined');
希望这会有所帮助!
【讨论】:
抱歉,我确实将端口设置为 1337;我只输入了代码的sn-ps。我有这条线:app.listen(1337);。 27017端口用于连接mongoDB获取数据。我不确定它是如何工作的,因为我确实打开了一个单独的终端作为 mongoDB 的服务器运行。从 404 开始,当我转到 url:127.0.0.1:1337/getData 时,它确实显示了 JSON obj,但伴随着通知:资源解释为 Document,但使用 MIME 类型 application/json 传输。我尝试了你的建议,但我遇到了同样的问题。对不起,丑陋的格式。【参考方案2】:来自http://api.jquery.com/jQuery.getJSON/ 有一个包含 2 '?' 的示例在网址中。
你只有一个,所以试试
$.getJSON('http://127.0.0.1:1337/getData?callback=?', function(rtndata)
看看这是否能摆脱你的 404 然后查看@jimbojw 建议以返回正确的 jsonp 格式响应。
【讨论】:
【参考方案3】:使用这个:
var express = require("express");
var server = express.createServer();
server.enable("jsonp callback");
server.get("/foo", function(req, res)
// this is important - you must use Response.json()
res.json("hello");
);
jsonp with node.js express
【讨论】:
在最新的 exp 版本中使用 res.jsonp("hello");它会根据您附加的 ?callback=myfunc 或否为您提供 json 或 jsonp。以上是关于使用服务器端语言作为 Javascript 的 JSONP 调用的主要内容,如果未能解决你的问题,请参考以下文章