2

我有一个像

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。我做了很多研究并试图替换它.end.jsonp但它不起作用。

4

2 回答 2

3

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 + ");"
于 2013-10-03T04:44:09.713 回答
1

正如 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.

Hth,
亚伦

于 2013-10-03T04:51:24.073 回答