Node.js передать переменную в маршрут

У меня очень простой вопрос node.js noob. Как передать переменную экспортированной функции маршрута?

Файл маршрутов

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

Серверный файл

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

Ошибка:.get() требует функций обратного вызова, но получает [объект Undefined]

Ответ 1

В вашем примере вы хотите создать новую функцию, которая будет закрываться вокруг вашего значения n. В вашем случае вы выполняете gettop и передаете возвращаемое значение для выражения в качестве маршрута, что означает, что gettop должен вернуть обработчик маршрута.

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

Ответ 2

Как ваш код выглядит так, как вы используете экспресс, вы можете использовать локальные сайты экспресс-приложений и выражать локали результатов, чтобы передавать переменные на ваш маршрут. В то время как другие ответы предлагают рабочие решения, я считаю, что менее навязчиво использовать экспресс-механизмы для установки этих переменных.

С ответными локалями (См. ссылку на экспресс-API) вам сначала нужно установить переменную где-то в промежуточном программном обеспечении или маршруте. Я покажу подход промежуточного программного обеспечения

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);
};

В случае, если вы хотите, чтобы эти настройки были широко распространены, лучше использовать локальные приложения (См. ссылку на экспресс-API)

Чтобы установить переменную локалей приложения, вы можете использовать

app.locals.top = 100;

Чтобы получить доступ к этой переменной из вашего маршрута, используйте

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

Ответ 3

В качестве альтернативы решению loganfsmyth (очень действительного!) вы можете оставить свою функцию gettop как есть и создать частичную функцию:

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