2014-03-28 101 views
0

我正在嘗試使用node.js,express,monk和mongodb來創建一個簡單的web服務,它根據URL中的參數從mongodb返回結果。我想給調用添加jsonp支持。該服務將被稱爲例如:JSONP支持node.js和mongo

localhost:3000/database/collection/get?param1=Steve&param2=Frank&callback=foo 

app.js

var mongo_address = 'localhost:27017/database'; 
var db = monk(mongo_address); 
app.get('/:coll/get', routes.handle(db); 

路線/ index.js

exports.handle = function(db) { 
    return function(req, res) { 

     // Send request 
     db.get(req.params.coll).find(req.query, {fields:{_id:0}}, function(e,docs) { 
      if (e) throw e;   
      res.jsonp(docs) 
     }); 
    }; 
} 

當我使用內置的JSONP支持,res.jsonp,它將回調參數發送給m​​ongo並返回一個空列表。我試着在查詢過程中剝離回調參數,然後手動將其添加回結果中,但沒有多少運氣。我覺得我錯過了簡單的事情。任何幫助,將不勝感激。

回答

1

一些與JS亂搞後,我發現用最少的額外代碼可行的解決方案。在從查詢中剝離回調並存儲函數值後,我必須爲JSONP請求顯式構建返回字符串。

exports.handle = function(db) { 
    return function(req, res) { 
     //Determine if URL implements JSONP 
     var foundCallback = req.query.callback; 
     var callbackVar; 
     //If asking for JSONP, determine the callback function name and delete it from the map 
     if (foundCallback){ 
      callbackVar = req.query.callback; 
      delete req.query.callback 
     } 

     // Send request 
     db.get(req.params.coll).find(req.query, {fields:{_id:0}}, function(e,docs) { 
      if (e) throw e; 

      //If callback, send function name and query results back, else use express JSON built in 
      if (foundCallback) 
       res.send('typeof ' + callbackVar + ' === \'function\' && ' + callbackVar + '(' + JSON.stringify(docs) + ');'); 
      else 
       res.json(docs); 
     }); 
    }; 
} 
0

嘗試

app.set("jsonp callback", true);