Node.js将变量传递到路由

Node.js将变量传递到路由,node.js,express,Node.js,Express,我有一个非常简单的node.js noob问题。如何将变量传递给导出的路由函数 路由文件 exports.gettop = function(n, req, res) { console.log(n); res.send(200); }; 服务器文件 app.get('/api/v1/top100', routes.gettop(100)); 错误:.get()需要回调函数,但得到了一个[object Undefined]例如,您希望创建一个新函数,该函数将接近您的n值。在本例中,

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

路由文件

exports.gettop = function(n, req, res) {
  console.log(n);
  res.send(200);
};
服务器文件

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

错误:.get()需要回调函数,但得到了一个[object Undefined]

例如,您希望创建一个新函数,该函数将接近您的
n
值。在本例中,您正在执行
gettop
并将返回的值传递给express作为您的路由,这意味着
gettop
需要返回路由处理程序

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

作为loganfsmyth(非常有效!)解决方案的替代方案,您可以将
gettop
函数保持原样,并创建一个部分函数:


由于您的代码看起来像是在使用express,您可以使用express应用程序局部变量和express结果局部变量将变量传递到路由。虽然其他答案提出了可行的解决方案,但我认为使用快速机制设置这些变量并不那么突兀

使用responselocals()时,首先必须在中间件或路由中的某个位置设置一个变量。我将展示中间件方法

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);
};
如果您想在应用程序范围内设置这些设置,更好的方法是使用应用程序局部变量()

要设置应用程序局部变量,可以使用

app.locals.top = 100;
要从路由访问此变量,请使用

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

在哪里

例如,require('./naas/autentication')

module.exports = function (req, res, next) {next();}
和require('./naas/authorization')(paramForRouter)是


在这种情况下,我更喜欢
app.set(…)
[req.]app.get(…)
,因为这不会有任何副作用(因为局部变量被传递到模板)。我必须在中间件函数中调用
next()
,这样页面就不会挂起。这为我节省了很多头痛和时间!谢谢奇怪的是,当绑定函数(routes.gettop)是一个“继承”方法(即,在对象的原型链中定义,而不是作为自己的方法)时,这种逻辑就不起作用了。该处理程序实际上已注册,但从未被调用@雷克斯利修斯说,它从来没有被称为奇怪的声音。我可以想象,它被不正确的上下文调用,在我的示例中是
null
,但是对于绑定方法,可能应该是实例(
routes
)。我最喜欢这个答案,在start.js中使用类似于app.post('/api/v1/project/new',new_project(db));-要将数据库变量传递到端点,然后在new_project.js中传递一个函数,该函数将返回与您相同的函数
app.post('/find_user',
   require('./naas/autentication'),
   require('./naas/authorization')(paramForRouter),
   require('./routes/users'));
module.exports = function (req, res, next) {next();}
module.exports = function (paramForRouter) {
    return function (req, res, next) {
        this.param = paramForRouter;
        console.log("Param value",this.param);
        next();
    };
};