Как я должен передать три аргумента в функцию стрелка экспресс / узел? - PullRequest
0 голосов
/ 26 сентября 2018

Я объявляю свою функцию следующим образом:

const parseConnections = (connectionsCSVPath, req, res) => { 
     //do a bunch of stuff 
} 

Внутри функции, если я пытаюсь вызвать res.locals.something, я получаю сообщение об ошибке «не могу прочитать локальные свойства неопределенных»пробовал несколько других синтаксисов, таких как:

const parseConnections = ((connectionsCSVPath, req, res) => { 
     //do a bunch of stuff 
}) 

this:

const parseConnections = (connectionsCSVPath, (req, res) => { 
     //do a bunch of stuff 
}) 

и this:

const parseConnections = connectionsCSVPath, (req, res) => { 
     //do a bunch of stuff 
} 

, и все они выдают ошибки.Как правильно передать эти 3 аргумента функции, чтобы все 3 были определены внутри?

Редактировать *: Затем функция вызывается так:

router.post(
'/upload/engagements/batch', checkIfAuthenticated,
parseConnections('./tmp/connections.csv'), 
parseMessages('./tmp/messages.csv'), (req, res) => { 
    //do a bunch of stuff 
}

1 Ответ

0 голосов
/ 26 сентября 2018

Проблема не (обязательно) в том, как вы определяете функцию, а в том, как вы ее используете.

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 
  }
);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...