2017-07-11 10 views
1

私は完全なスタックプロジェクトを作成しようとします。それはサインアップ、ログイン、プロフィールなどのコントローラを持っています。Expressで複数のコントローラを必要とする方法は?

私は何をしているのですか?私はそれぞれのコントローラを手動で要求し、要求に従って使います。例えば、私はプロジェクトの複雑さを構築する際に、より多くのコントローラが必要とされるであろう、しかし

app.use('/signup',signup); 
app.use('/login',login); 
app.use('/profile',profile); 

を持っていますが、手動ですべてのものを入力すると、ベストプラクティスではありませんでしょう。

私はちょうど1行がすべての作業を行い、より一般的な形式を持つようにしたい:

app.use('whatever the link i got',load the corresponding controller); 

たぶんソリューションは、さまざまな形態であろう。どうすればこれを達成できますか?私はいくつかの提案が必要です。

答えて

0

最も簡単な解決策は、おそらくcontrollersディレクトリにすべてを入れても、その後、ちょうどこれを行うだろう:これは、限り、あなたのルートやコントローラが同じものを命名されているように、素晴らしい作品

const controllers = readdirSync(path.join(__dirname, 'controllers')) 
controllers.forEach(controller => { 
    app.use(`/${controller}`, require(`./controllers/${controller}`)) 
}) 

。ケバブをケーキケースに変換する必要がある場合は、常にlodashがあります。

エクスプレス4を使用していると仮定すると、これをもう一度実行してコントローラのディレクトリにindex.jsを入れることができます。インサイド:

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

const controllers = readdirSync(__dirname)) 
    .filter(f => f !== 'index.js')) 
controllers.forEach(controller => { 
    router.use(`/${controller}`, require(`./${controller}`)) 
}) 

module.exports = router 

その後、あなたはこのようにルータを使用することができます:私はそれは、Fされなければならないと考えている

app.use( '/'、(」./コントローラを必要とする))

+0

を= > f.endsWith( '。js')、そうではありません!また、このコードを使用すると、Router.use()はミドルウェア機能が必要ですが、Objectを取得しています。助けが必要 –

+0

@jianchengwu申し訳ありませんが、それはそれ自身のディレクトリに各ルートを持っていたプロジェクトからそれをコピーしました。私は上記の答えを修正した。それを試してみてください。また、controllersディレクトリ内のコントローラとindex.jsファイル以外のものがないことを確認してください。 –