2016-12-28 30 views
10

コードをきれいにして簡単に保守できるように、簡単なルート解析関数を作成しました。アプリが起動し、config.jsonファイルを解析し、適切な方法とリクエストパスをバインドしますエラーが発生するCreateListFromArrayLikeは、.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); 
    } 
    } 
} 

私が持っている問題は、私は特急ルータ、例えばに複数の引数を渡す必要があるいくつかの倍でありますこのようなパスポート何か使用した場合には:

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 

私は[ [Function: authenticate], [Function] ]

参照I console.log(fn)場合

私は何が間違っているのか正確にはわかりません。どんな情報でも大変感謝しています。あなたはこのように、配列としてのparamsを送信する必要が

答えて

21

:あなたは、引数を送信する場合は

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

は、あなたが電話を使用する必要があるリスト:

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

ソース:call,apply

関連する問題