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 中止请求?

有哪些关于 Node.js 以及 Express 的书籍

将 Node.js 的 Express 与 vhost 一起使用时出现意外错误

Node.js与Express联合中间件express-fileupload使用axios实现文件上传

认识 Express 的 res.send() 和 res.end()

请求新页面时如何将 AngularJS 路由与 Express (Node.js) 一起使用?