2013-10-02 66 views
2

我有一個像的Node.js(快遞).END()與JSONP

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,但它不起作用。

+0

http://rambleabouttech.blogspot.com/2012/08/jquery-json-vs-jsonp-using-nodejs.html – Renaissance

+0

我不明白的是這個瀏覽器端或node.js。 jquery如何介入這裏。在express中有一個'.jsonp'響應,但不在native node.js中。使用快速'.jsonp'時不需要設置標題。同樣對於jsonp'Content-Type'必須是'application/javascript' – user568109

回答

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 + ");" 
+1

通常查詢參數被命名爲'callback'而不是'jsonp',但只要記錄正確,它並不重要。 – Bergi

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(或其它)時,它的loadded來處理你的數據的功能。

你所要做的就是確保你換你的JSON輸出,回調函數的名稱,因此,如果您迴應JSON 這個樣子:

{"a":1, "b":2} 

...那麼你需要來包裝它,所以它看起來是這樣的:

jQuery123456789('{"a":1, "b":2}') 

再次,user2840784指出的那樣,你可以從req.query.jsonp獲取回調的名稱。

H個,
亞倫