JSONP 支持 node.js 和 mongo
Posted
技术标签:
【中文标题】JSONP 支持 node.js 和 mongo【英文标题】:JSONP support with node.js and mongo 【发布时间】:2014-05-07 08:58:30 【问题描述】:我正在尝试使用 node.js、express、mongo 和 mongodb 创建一个简单的 Web 服务,它根据 URL 中的参数从 mongodb 返回结果。我想为调用添加 jsonp 支持。该服务将被这样调用:
localhost:3000/database/collection/get?param1=Steve¶m2=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)
);
;
当我使用 res.jsonp 的内置 JSONP 支持时,它会将回调参数发送到 mongo 并返回一个空列表。我尝试在查询期间删除回调参数,然后手动将其添加回结果中,但运气不佳。我觉得我错过了一些简单的东西。任何帮助将不胜感激。
【问题讨论】:
【参考方案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);
);
;
【讨论】:
【参考方案2】:试试
app.set("jsonp callback", true);
【讨论】:
以上是关于JSONP 支持 node.js 和 mongo的主要内容,如果未能解决你的问题,请参考以下文章
在 express.js 中为 node.js 使用 jsonp
javascript/node.js 中的 JSONP 解析
node.js 中未定义 JSONP,使用 .send 会导致意外令牌错误