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
麻省理工学院