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