Проблема не (обязательно) в том, как вы определяете функцию, а в том, как вы ее используете.
parseConnections('./tmp/connections.csv')
вызывает функцию тут же и там.Вы передаете ему только один аргумент, поэтому req
и res
будут undefined
.
function foo(a, b, c) {
console.log('a:', a);
console.log('b:', b);
console.log('c:', c);
}
foo('first argument');
Однако you не может передавать значения для req
и res
, поскольку эти значения создаются и передаются самим выражением.
По сути, вы делаете ошибку , вызывая функцию, в которой вы должны передавать это.router.post
ожидает, что будет передана одна или несколько функций .Но вы вызываете parseConnections
и вместо этого передаете возвращаемое значение, которое, вероятно, составляет undefined
.
. Вот простой пример, демонстрирующий разницу:
function foo(x) {
console.log('inside foo', 'x is ', x);
}
// bar expects to be passed a function that it can call
function bar(callback) {
console.log('bar received:', callback);
try {
callback(42);
} catch(e) {
console.error(e);
}
}
// this will work as expected
console.log('Passing a function');
bar(foo);
// this will error because `bar` doesn't receive a function.
// this is what you are doing
console.log('Calling a function and passing its return value');
bar(foo(21));
Один из способов решения вашей проблемы - заставить parseConnections
вернуть функцию , которая затем будет получена router.post
.Я использую здесь обычные объявления функций, чтобы синтаксис не был слишком запутанным:
function parseConnections(connectionsCSVPath) {
return function(req, res) {
//do a bunch of stuff
};
}
Это не требует никаких изменений в вашем router.post
вызове.
Другое решение состоит в том, чтобыпередать router.post
функцию, которая вместо этого вызывает parseConnections
, передавая req
и res
:
router.post(
'/upload/engagements/batch',
checkIfAuthenticated,
(req, res) => parseConnections('./tmp/connections.csv', req, res),
// alternatively you can use `.bind`:
// parseConnections.bind(null, './tmp/connections.csv'),
parseMessages('./tmp/messages.csv'), // <- this is likely wrong as well,
// but I leave this to you to figure out
(req, res) => {
//do a bunch of stuff
}
);