2013-04-14 73 views
12

我有非常简单的node.js noob问题。如何将变量传递给导出的路由函数?Node.js将变量传递给路由

routes文件

exports.gettop = function(n, req, res) { 
    console.log(n); 
    res.send(200); 
}; 

服务器文件

app.get('/api/v1/top100', routes.gettop(100)); 

错误:获得()需要回调函数,但有一个[对象未定义]

回答

25

对于你的榜样,你要创建一个新功能将关闭您的价值n。在你的情况下,你正在执行gettop并传递返回的值来表示你的路由,这意味着gettop需要返回路由处理程序。 (!非常有效)

exports.gettop = function(n){ 
    return function(req, res) { 
     console.log(n); 
     res.send(200); 
    }; 
}; 
7

作为替代loganfsmyth的解决方案,你可以留下你的gettop功能,是创造的部分功能:

app.get('/api/v1/top100', routes.gettop.bind(null, 100)); 
+0

这救了我的头痛和时间的很多!谢谢! – Tobi

+0

奇怪的是,当绑定函数(routes.gettop)是一个“继承”方法(即,在对象的原型链中定义而不是作为其自己的方法)时,此逻辑不起作用。处理程序实际上是注册的,但它永远不会被调用! – LexLythius

+0

@LexLythius它永远不会被调用听起来很奇怪。我可以想象它会被不正确的上下文调用,在我的例子中它是'null',但对于绑定方法应该可能是实例('routes')。 – robertklep

13

当你的代码看起来像你使用快递,您可以使用快递应用程序本地人和表达结果当地人将变量传递到您的路线。虽然其他答案提出了工作解决方案,但我认为使用快速机制来设置这些变量并不那么突兀。

对于本地响应(See Express API reference),您首先必须在中间件或路由的某处设置变量。我会告诉中间件方法

app.use(function(req,res, next) { 
    res.locals.top = 200; 
    next(); 
}); 

然后在你的路线,你可以通过res.locals.variablename

exports.gettop = function(req, res) { 
    console.log(res.locals.top); 
    res.send(200); 
}; 

访问此属性如果你想使这些设置应用广泛的一种更好的方法是使用的应用程序当地人(See Express API reference

要设置一个应用程序变量当地人可以使用

app.locals.top = 100; 

从您的路径访问此变量使用

exports.gettop = function(req, res){ 
    console.log(req.app.locals.top); 
    res.send(200); 
}; 
+1

在这种情况下,我更喜欢'app.set(...)'和'[req。] app.get(...)',因为它不会有任何副作用(因为当地人传递给模板)。 – robertklep

+0

我不得不在中间件函数内调用next(),所以页面不会挂起。 –

+0

@AmirEldor谢谢!更正了这个问题 – saintedlama