使用服务器端语言作为 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 调用的主要内容,如果未能解决你的问题,请参考以下文章

全球 JavaScript 开发者薪酬揭晓,你拖后腿了吗?

JavaScript基础大总结

Node.js基本介绍和服务端创建的入门案例

Node.js 简介

8 行 Node.js 代码实现代理服务器

javascript JSON