Получение ошибки CreateListFromArrayLike вызывается не-объект при попытке использовать .apply()

Я создал небольшую небольшую функцию разбора маршрута, чтобы я мог сохранить свой код в чистоте и легко ремонтируемом, это небольшая функция, которая запускается при запуске приложения и анализирует файл config.json и связывает соответствующие методы и пути запроса:

const fs = require('fs');
const path = require('path');
module.exports = function(app, root) {
  fs.readdirSync(root).forEach((file) => {
    let dir = path.resolve(root, file);
    let stats = fs.lstatSync(dir);
    if (stats.isDirectory()) {
      let conf = require(dir + '/config.json');
      conf.name = file;
      conf.directory = dir;
      if (conf.routes) route(app, conf);
    }
  })
}

function route(app, conf) {
  let mod = require(conf.directory);

  for (let key in conf.routes) {
    let prop = conf.routes[key];
    let method = key.split(' ')[0];
    let path = key.split(' ')[1];

    let fn = mod[prop];
    if (!fn) throw new Error(conf.name + ': exports.' + prop + ' is not defined');
    if (Array.isArray(fn)) {
      app[method.toLowerCase()].apply(this, path, fn);
    } else {
      app[method.toLowerCase()](path, fn);
    }
  }
}

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

exports.authSteam = [
  passport.authenticate('facebook', { failureRedirect: '/' }),
  function(req, res) {
    res.redirect("/");
  }
];

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

{
  "name": "Routes for the authentication",
  "description": "Handles the authentication",
  "routes": {
    "GET /auth/facebook": "authFacebook",
    "GET /auth/facebook/return": "authFacebookReturn"
  }
}

Единственная проблема: я получаю эту ошибку:

     app[method.toLowerCase()].apply(this, path, fn);
                                ^

TypeError: CreateListFromArrayLike called on non-object

если я console.log(fn) Я вижу [ [Function: authenticate], [Function] ]

Я не совсем уверен, что я делаю неправильно, любая информация будет большой благодарностью.

Ответ 1

Вам нужно отправить параметры как массив, например:

app[method.toLowerCase()].apply(this, [path, fn]);

Если вы хотите отправить список аргументов, вам необходимо использовать вызов:

app[method.toLowerCase()].call(this, path, fn);

Источник: call, apply