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"