2016-12-28 11 views
10

Stworzyłem prostą, małą funkcję analizy parsowania, dzięki czemu mogę zachować mój kod w czystości i łatwo go utrzymywać, to jest ta mała funkcja, która zostaje uruchomiona, gdy Aplikacja uruchamia się i analizuje plik config.json i wiąże odpowiednie metody i żądania ścieżki:Błąd pobierania CreateListFromArrayLike wywoływany przy próbie użycia .apply()

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

problem mam tylko kilka razy muszę przechodzić w wielu argumentów do wyraźnego routera, np w przypadku korzystania z paszportu coś takiego:

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

więc postać mogę tylko przekazać je w postaci tablicy, a następnie przetworzyć je do routera odpowiednio, mój config na przykład wygląda następująco:

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

jedynym problemem jest dostaję taki błąd:

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

TypeError: CreateListFromArrayLike called on non-object 

gdybym console.log(fn) widzę [ [Function: authenticate], [Function] ]

Nie jestem dokładnie pewien, co robię źle, każda informacja byłaby wielka dzięki.

Odpowiedz

21

Musisz wysłać params jako tablicę, tak:

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

Jeśli chcesz wysłać listy an argumentów trzeba użyć połączenia:

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

źródłowy : call, apply

Powiązane problemy