在express - Node.JS中传递额外参数

时间:2013-08-14 23:57:28

标签: javascript node.js parameters express scope

我正在尝试从节点应用程序中删除匿名函数。例如:

app.post('/page-edit.json', function (req, res) {
    db.get(req.body.page_id, function (err, doc) {
        res.contentType('json');
        res.send(doc);
    });
});

所以说我打破了内部功能:

function innerMost(err, doc) {
    res.contentType('json');
    res.send(doc);
}

function outer(err, doc) {
     db.get(req.body.page_id, innerMost);
}


app.post('/page-edit.json', outer);

问题是,如何将额外的参数(例如'res')传递给'innerMost'?它在这个过程中迷失了。

如果您想查看源代码(或者甚至想要参与开源项目!),您可以看到它here

3 个答案:

答案 0 :(得分:0)

这可能是你用常规JS做的最好的:

function outer(req, res) {
    function innerMost(err, doc) {
        res.contentType('json');
        res.send(doc);
    }

    db.get(req.body.page_id, innerMost);
}

app.post('/page-edit.json', outer);

但是,您可能希望查看各种异步库,例如https://github.com/caolan/async。如果你想进一步冒险,你可以考虑使用icedcoffeescript http://maxtaco.github.io/coffee-script/,这在我看来非常好。

答案 1 :(得分:0)

听起来你正在寻找的是currying(也称为“部分应用函数”),它基本上允许你提前预填充一些参数的值。

John Resig在this上写了一篇很好的文章。

从他的写作中抓取一些代码,你可以像这样创建一个partial函数:

Function.prototype.partial = function(){
    var fn = this, args = Array.prototype.slice.call(arguments);
    return function(){
      var arg = 0;
      for ( var i = 0; i < args.length && arg < arguments.length; i++ )
        if ( args[i] === undefined )
          args[i] = arguments[arg++];
      return fn.apply(this, args);
    };
};

在你的情况下,像这样使用它:

function innerMost(err, doc, req, res) {
    res.contentType('json');
    res.send(doc);
}

function outer(req, res) {
    //partially apply `innerMost` here by passing in `req` and `res`
    db.get(req.body.page_id, innerMost.partial(undefined, undefined, req, res));
}

app.post('/page-edit.json', outer);

请注意,此代码未经过测试。

答案 2 :(得分:0)

我倾向于使用Function.bind()将事情分开,所以你不需要乱用Function的原型,外部库等。

function innermost(req, res, e, r){
    res.end(r)
}

function somedbfunc(q, cb){
    cb(null, 'db results');
}

function outer(req, res){
    somedbfunc('query', innermost.bind(this, req, res));
}

app.all('*', outer)
    ==> "db results"