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

Javascript 在express-Node.JS中传递额外参数,javascript,node.js,parameters,express,scope,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.co

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

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'中?它在这个过程中迷失了方向


如果你想看源代码(甚至想为开源项目做贡献!),你可以看

这可能是常规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);

但是,您可能希望查看各种异步库,例如。如果你想更进一步,你可以考虑使用IcedOfficeScript,这在我看来相当不错。

听起来你想要的是
currying
(也称为“函数的部分应用”),它基本上可以让你提前预填充一些参数的值

约翰·雷斯格写得很好

从他的writeup中获取一些代码,您可以创建如下的
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);

注意,这段代码没有经过测试。

我倾向于使用Function.bind()来区分这些内容,所以您不需要弄乱函数的原型、外部库等

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"