この質問に対する決定的な答えはありません。答えは、アプリケーションの規模と関係するチームによって異なります。可能な限り柔軟性を高めるために、Expressは構造に関して前提を設けません。
ルートやその他のアプリケーション固有のロジックは、必要な数のファイルに、任意のディレクトリ構造で配置できます。以下の例を参考にしてください。
また、Expressのサードパーティ製拡張機能もあり、これらのパターンの一部を簡素化します。
Expressはデータベースの概念を持ちません。この概念はサードパーティのNodeモジュールに任されており、ほぼすべてのデータベースと連携できます。
モデルを中心としたExpressベースのフレームワークについては、LoopBackを参照してください。
認証は、Expressが踏み込まないもう1つの意見の分かれる領域です。任意の認証スキームを使用できます。単純なユーザー名/パスワードスキームについては、この例を参照してください。
Expressは、(path, locals, callback)
シグネチャに準拠するすべてのテンプレートエンジンをサポートしています。テンプレートエンジンのインターフェースとキャッシュを正規化するには、consolidate.jsプロジェクトのサポートを参照してください。リストにないテンプレートエンジンでも、Expressシグネチャをサポートしている場合があります。
詳細については、Expressでのテンプレートエンジンの使用を参照してください。(日本語版へのリンクに変更)
Expressでは、404レスポンスはエラーの結果ではないため、エラーハンドラーミドルウェアはそれらをキャプチャしません。この動作は、404レスポンスが追加の作業がないことを示しているためです。つまり、Expressはすべてのミドルウェア関数とルートを実行し、それらのいずれも応答しなかったことを確認しました。404レスポンスを処理するには、スタックの一番下(他のすべての関数の
app.use((req, res, next) => {
res.status(404).send("Sorry can't find that!")
})
実行時にexpress.Router()
のインスタンスにルートを動的に追加することで、ルートがミドルウェア関数によって置き換えられないようにします。
エラー処理ミドルウェアは、他のミドルウェアと同じ方法で定義しますが、3つではなく4つの引数を使用します。具体的には、(err, req, res, next)
シグネチャを使用します。
app.use((err, req, res, next) => {
console.error(err.stack)
res.status(500).send('Something broke!')
})
詳細については、エラー処理を参照してください。(日本語版へのリンクに変更)
しません! res.render()
関数でHTMLを「レンダリング」する必要はありません。特定のファイルがある場合は、res.sendFile()
関数を使用します。ディレクトリから多くのアセットを提供する場合は、express.static()
ミドルウェア関数を使用します。