2017-05-23 12 views
0

次のnode.jsモジュールは、初期化中にを2回、初期化中に2回ログを期待どおりに記録します。モデルパラメータは何とか上書きされ、ルートを使用しようとすると、常にModelAが記録されます。ファンクションパラメータが上書きされます

module.exports = (model) => { 
    console.log(model.modelName); 
    return (db) => { 
    console.log(model.modelName); 

    router.post('/', (req, res, next) => { 
     console.log(model.modelName); 
     model.insertMany(req.body, (err, docs) => { 
     if(err) return next(err); 
     res.json(docs); 
     }); 
    }); 

    return router; 
    }; 
}; 

モジュールは、次のように使用されます。

const express = require('express'); 
const router = express.Router(); 

const plural = require('./plural.js'); 

module.exports = (db) => { 
    router.use('/a', plural(db.ModelA)(db)); 
    router.use('/b', plural(db.ModelB)(db)); 

    return router; 
}; 
+1

コードが正しく表示されません。関数の結果を 'router.use()'に渡す引数として使用しているので、ミドルウェアまたは 'Router'インスタンスを' db'パラメータで関数から返す必要があります。現在はデフォルトで 'undefined'を返しています。 – mscdex

+0

私は少しコードを短絡し、 'return router;'が失われました。実際のコードはルータを返しています。 – raptor

答えて

1

は、あなただけではなく、関数内Routerインスタンスを作成する必要があり、その後、plural.jsの一番上に新しいRouterインスタンスを作成していると仮定すると、これはルートハンドラ(router.post(...))を追加します。それ以外の場合は、同じRouterインスタンスを両方とも返し、plural()への2回目のコールは同じRouterに追加するだけです。そのため、ModelAベースのルートハンドラは常に最初に実行され、(next()を呼び出さない限り)その要求に応答します。例:

const Router = require('express').Router; 
// const router = new Router(); // <--- move this line ... 
module.exports = (model) => { 
    return (db) => { 
    const router = new Router(); // <--- ... to here 

    router.post('/', (req, res, next) => { 
     console.log(model.modelName); 
     model.insertMany(req.body, (err, docs) => { 
     if(err) return next(err); 
     res.json(docs); 
     }); 
    }); 

    return router; 
    }; 
}; 
関連する問題