JSONP支持node.js和mongo

时间:2014-03-28 03:31:50

标签: javascript node.js mongodb express jsonp

我尝试使用node.js,express,monk和mongodb创建一个简单的Web服务,该服务根据URL中的params返回mongodb的结果。我想为调用添加jsonp支持。该服务将被称为:

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)
        });
    };
}

当我使用res.jsonp内置的JSONP支持时,它将回调参数发送到mongo并返回一个空列表。我已经尝试在查询期间删除回调参数,然后手动将其添加回结果而没有太多运气。我觉得我错过了一些简单的事情。任何帮助将不胜感激。

2 个答案:

答案 0 :(得分: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);
        });
    };
}

答案 1 :(得分:0)

尝试

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