Node.js(express) .end() 与 JSONP
Posted
技术标签:
【中文标题】Node.js(express) .end() 与 JSONP【英文标题】:Node.js(express) .end() with JSONP 【发布时间】:2013-10-09 11:54:01 【问题描述】:我有一个类似的功能
User.prototype._send = function(type, code, message, callback)
if(!message && typeof code != 'number')
callback = message;
message = code;
code = 200;
if(typeof message != 'string')
message = JSON.stringify(message);
if(type == 'connection' && this.connection)
this.connection.writeHead(code || 200,
'Content-Type': 'application/json',
'Content-Length': message.length
);
this.connection.end(message);
else
if(!this.listeners.length)
return this.message_queue.push(arguments);
var cx = this.listeners.slice(), conn;
this.listeners = [];
while(conn = cx.shift())
conn.writeHead(code || 200,
'Content-Type': 'application/json',
'Content-Length': message.length
);
conn.end(message);
if(callback) callback();
;
它现在将 JSON 返回给客户端。但我希望它返回 JSONP。我做了很多研究,并试图用.jsonp
替换.end
,但它不起作用。
【问题讨论】:
rambleabouttech.blogspot.com/2012/08/… 我不明白这是浏览器端还是node.js。这里如何涉及 jquery。 express 中有.jsonp
响应,但本机 node.js 中没有。使用 express .jsonp
时不需要设置标题。同样对于 jsonp Content-Type
必须是 application/javascript
【参考方案1】:
JSONP("JSON with padding") 是一种通信技术,不是另一种对象表示法。 详情请见http://en.wikipedia.org/wiki/JSONP。
基本上,您的应用程序需要接受查询参数jsonp
并使用该参数或回调包装 json 消息,如下所示
var jsonpCallback = req.query.jsonp; //Assuming you are using express
message = JSON.stringify(message);
message = jsonpCallback + "(" + message + ");"
【讨论】:
通常查询参数被命名为callback
而不是jsonp
,但只要有正确的文档说明,这并不重要。【参考方案2】:
正如 user2840784 指出的那样,您需要回调才能使其正常工作。为了详细说明他们的答案,客户端库在发出请求时需要指定“客户端回调”:
http://my-service.com/get-data.json?callback=callThisFunction
如果您在客户端使用 jQuery,jQuery 会在您发出 $.ajax
请求时为您提供回调名称,因此您的请求将如下所示:
http://my-service.com/get-data.json?callback=jQuery123456789
在幕后,jQuery 秘密创建了一个名为 jQuery123456789
(或其他名称)的函数,用于在加载数据时处理您的数据。
你必须做的是确保你用回调函数名称包装你的 JSON 输出,所以如果你的响应 JSON 会如下所示:
"a":1, "b":2
...那么你需要把它包装起来,使它看起来像这样:
jQuery123456789('"a":1, "b":2')
同样,正如 user2840784 所指出的,您可以从req.query.jsonp
获取回调的名称。
第, 亚伦
【讨论】:
以上是关于Node.js(express) .end() 与 JSONP的主要内容,如果未能解决你的问题,请参考以下文章
将 Node.js 的 Express 与 vhost 一起使用时出现意外错误
Node.js与Express联合中间件express-fileupload使用axios实现文件上传