Node.js で API と Web アプリを構築するための、堅牢な構造のアプリケーション レイアウト。
slay
の目標は、ユーザーに膨大な規則を強制することなく、Node.js アプリケーションに絶対最小限の一貫性を提供することです。一貫性の目標は、最大限の再利用を実現するためにアプリケーション レベルのコードのモジュール化を促進することにも重点を置いています。これは、アプリケーション レイアウト、「プリブート」、一貫したアプリケーションの起動という 3 つのシンプルな機能によって実現されます。
慣例により、 slay
次の場所でユーザー定義モジュールを探します。
lib/preboots
lib/middlewares
lib/routes
これは、標準の組み込み Node.js モジュールの読み込みを使用して行われます。つまり、これらのそれぞれがフォルダーではなく、同じ名前の個別のファイルである可能性があります。アプリケーションが複雑になるにつれて、自由に組み合わせて使用してください。例えば:
lib/preboots/index.js
lib/middlewares.js
lib/routes/index.js
「プリブートはアプリケーション拡張のためのミドルウェアです」
つまり、プリブートはfunction (req, res, next)
の代わりにfunction (app, options, done)
になります。アプリケーションの拡張性に対して一貫した関数シグネチャを強制することにより、すべての要求の順序付けの問題が簡単になります。例えば:
lib/preboots/index.js
module . exports = function ( app , options , done ) {
//
// **SCHEDULE** the attachment and initialization of
// connections to our models.
//
app . preboot ( require ( './models' ) ) ;
done ( ) ;
} ;
lib/preboots/models.js
module . exports = function ( app , options , next ) {
//
// Attach all of the models for our API / microservices
// to the app itself and connect to them
// (e.g. initialize TCP sockets, etc).
//
app . models = require ( '../models' ) ;
app . models . connect ( next ) ;
} ;
これは明白すぎるように思えるかもしれませんが、いくつかのことを行います。
lib/preboots/index.js
) に配置されるようにします。 const slay = require ( 'slay' ) ;
const app = new slay . App ( __dirname ) ;
app . start ( options , function ( err ) {
if ( err ) { throw err ; }
app . log . info ( `Listening on ${ app . config . get ( 'http' ) ` ) ;
} ) ;
上記でapp.start
呼び出すと、2 つの主要なインターセプターがトリガーされます。
"setup"
インターセプター。/preboots
app.before('setup')
にロードされますrouters
app.before('setup')
でapp.perform('routers')
がトリガーされるapp.router
app.after('routers')
またはapp.perform('setup')
によって利用可能になります。"start"
インターセプターlib/routes
app.before('start')
にロードされますlib/routes/index.js
app.perform('actions')
を1 回呼び出して、 app.router
からのすべてのルートがアプリにロードされていることを確認する必要があります。lib/middlewares
before('start')
にロードされます詳細については、
App.Bootstrap
を参照してください。
slay
によって公開されるApp
、express によって作成されたapp
によって公開されるすべての機能に加えて、次の機能が含まれています。
方法 | 説明 | 継承元 |
---|---|---|
App.bootstrap | コアslay ストラップフロー | slay.App |
app.hookable | フック可能なアクションを定義します | slay.App |
app.stack | ミドルウェアスタックを定義します | slay.App |
app.config | nconf を介した構成のロード | プリブートconfig |
app.log | winston を通じて定義されたロガー | logger プリブート |
app.routes | 最上位のexpress Router | routers プリブート |
app.preboot | プリブートをスケジュールする | broadway |
app.mixin | アプリに機能を追加する | broadway |
app.start | アプリケーションを起動する | broadway |
app.close | アプリケーションをシャットダウンする | broadway |
app.perform | 名前付きインターセプターを実行する | understudy |
app.before | 名前付きインターセプタの前に実行する | understudy |
app.after | 名前付きインターセプタの後に実行 | understudy |
名前 | 説明 | 呼び出し元 |
---|---|---|
setup | 起動前のブートストラップ設定 | slay |
start | メインアプリケーションの起動 | slay |
routers | app.routes の定義 | slay |
actions | クリティカル パス アプリケーションの機能 | ユーザー |
Stack
before
after
ミドルウェアのセットを格納する軽量のコンテナーです。これは、アプリケーション内に複数のルーターが存在する可能性がある場合に非常に役立ちます。 Stack
、次のようにapp.stack
を使用して定義できます。
ミドルウェア.js
module . exports = function ( app , options , next ) {
//
// An authorization middleware for different roles
// returns an HTTP middleware function when invoked.
//
var authorize = require ( './authorize' ) ;
//
// Stack middlewares can be declared and used inline
//
app . use (
app . stack ( {
name : 'admin-only' ,
before : [ authorize ( 'admin' ) ]
} ) . middleware ( function ( req , res , next ) {
// Dispatch (req, res) to a router.
} )
) ;
//
// Or extended from a previous declaration and used inline
//
app . use (
app . stacks [ 'designer-only' ]
. before ( authorize ( 'designer' ) )
. middleware ( function ( req , res , next ) {
// Dispatch (req, res) to a router.
} )
) ;
} ;
app.stack
の呼び出しによって作成されたすべてのStack
インスタンスは、 app.stacks
オブジェクトで公開されます。
app.start([options], callback);
が呼び出されます。app.perform('setup')
「setup」インターセプターbefore
実行されます (「アンダースタディ インターセプター」を参照)。これにより、次のような組み込みのslay
プリブートが実行されます。app.config
( nconf.Provider
のインスタンス)を作成します。app.log
( winston.Logger
のインスタンス)を作成します。lib/preboots[.js]?
内)。これにより、同期または非同期方式での拡張性のために、任意のユーザー定義のプリブートが可能になります。lib/middlewares[.js]?
)。lib/routes[.js]?
内)。after
インターセプターが呼び出されます。 (参照: 代役インターセプター)。ここでは、 slay
デフォルトでは何も実行しません。app.perform('start')
「開始」インターセプターbefore
実行されます (「アンダースタディ インターセプター」を参照)。これにより、次のような組み込みのslay
プリブートが実行されます。app.perform('routers')
を呼び出します。これは「routers」インターセプターbefore
実行され、 app.routes
を追加し、「routers」インターセプターafter
実行されます。lib/preboots[.js]?
内)。上記(2)で予定しております。lib/middlewares[.js]?
内)を呼び出します。lib/routes[.js]?
内)を呼び出します。app.routes
に最後の 404 ハンドラーを追加します。App.prototype._listen
が呼び出され、 http
サーバーやhttps
サーバーが作成されます。after
インターセプターが呼び出されます。 (参照: 代役インターセプター)。ここでは、 slay
デフォルトでは何も実行しません。app.start([options], callback);
からのcallback
が呼び出されます。 app
が起動し、使用できるようになりました。 npm test
マサチューセッツ工科大学