【问题标题】:Node.js(express) .end() with JSONPNode.js(express) .end() 与 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,但它不起作用。

【问题讨论】:

  • 我不明白这是浏览器端还是node.js。这里如何涉及 jquery。 express 中有.jsonp 响应,但本机 node.js 中没有。使用 express .jsonp 时不需要设置标题。同样对于 jsonp Content-Type 必须是 application/javascript

标签: javascript node.js jsonp


【解决方案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 获取回调的名称。

第,
亚伦

【讨论】:

    猜你喜欢
    • 2013-08-16
    • 2021-01-02
    • 1970-01-01
    • 1970-01-01
    • 2014-10-05
    • 2016-12-09
    • 2013-03-04
    • 1970-01-01
    • 2012-07-18
    相关资源
    最近更新 更多