slay
1.0.0
堅如磐石的結構化應用程式佈局,用於在 Node.js 中建立 API 和 Web 應用程式。
slay
的目標是在 Node.js 應用程式中提供絕對最小的一致性,而不向使用者強制遵循大量約定。一致性目標也圍繞著鼓勵應用程式層級程式碼的模組化以實現最大程度的重複使用。這是透過三個簡單的功能來實現的:應用程式佈局、「預先啟動」和一致的應用程式啟動。
依照慣例, 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
會觸發兩個主要的攔截器:
"setup"
攔截器。/preboots
將在app.before('setup')
中載入routers
app.perform('routers')
在app.before('setup')
中觸發app.router
將透過app.after('routers')
或app.perform('setup')
來使用"start"
攔截器lib/routes
將在app.before('start')
中載入lib/routes/index.js
應呼叫app.perform('actions')
一次,以確保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 路由器 | 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
的輕量級容器。當您的應用程式中可能有多個路由器時,這會變得非常有用。可以使用app.stack
定義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
執行(請參閱:understudy 攔截器)。這將執行內建的slay
預先引導,其中:app.config
( nconf.Provider
的實例)。app.log
( winston.Logger
的實例)。lib/preboots[.js]?
)。這允許任意使用者定義的預先引導,以同步或非同步方式進行擴展。lib/middlewares[.js]?
)。lib/routes[.js]?
)。after
攔截器都會被呼叫。 (參見:替補攔截器)。 slay
預設不運行任何內容。app.perform('start')
在「start」攔截器before
執行(請參閱:understudy 攔截器)。這將執行內建的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
麻省理工學院