เค้าโครงแอปพลิเคชันที่มีโครงสร้างแข็งแกร่งสำหรับการสร้าง API และเว็บแอปใน Node.js
เป้าหมายของ 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)
preboot คือ 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
App
ที่เปิดเผยโดย slay
มีฟังก์ชันทั้งหมดที่ app
สร้างขึ้นโดย Express พร้อมด้วย:
วิธี | คำอธิบาย | สืบทอดมาจาก |
---|---|---|
App.bootstrap | กระแสบูตสแตรปของ Core slay | slay.App |
app.hookable | กำหนดการดำเนินการ hookable | slay.App |
app.stack | กำหนดมิดเดิลแวร์สแต็ก | slay.App |
app.config | กำหนดค่าการโหลดผ่าน nconf | config ค่าพรีบูต |
app.log | Logger กำหนดโดย 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
มิดเดิลแวร์ สิ่งนี้จะมีประโยชน์มากเมื่อคุณอาจมีเราเตอร์หลายตัวในแอปพลิเคชันของคุณ 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.
} )
) ;
} ;
อินสแตนซ์ Stack
ทั้งหมดที่สร้างขึ้นโดยการเรียกใช้ app.stack
จะถูกเปิดเผยบนออบเจ็กต์ app.stacks
app.start([options], callback);
ถูกเรียกใช้app.perform('setup')
ดำเนินการ before
ตัวดัก "ตั้งค่า" (ดู: understudy interceptors) สิ่งนี้จะรัน preboots slay
ในตัวซึ่ง:app.config
(อินสแตนซ์ของ nconf.Provider
)app.log
(อินสแตนซ์ของ winston.Logger
)lib/preboots[.js]?
) ซึ่งช่วยให้สามารถพรีบูตที่ผู้ใช้กำหนดได้ตามต้องการเพื่อความสามารถในการขยายในแบบซิงค์หรืออะซิงก์lib/middlewares[.js]?
)lib/routes[.js]?
)after
"ตั้งค่า" จะถูกเรียกใช้ (ดู: ผู้สกัดกั้นการศึกษา) slay
ไม่ได้ทำอะไรเลยตามค่าเริ่มต้นที่นี่app.perform('start')
ดำเนินการ before
ตัวดัก "start" (ดู: understudy interceptors) สิ่งนี้จะรัน preboots slay
ในตัวซึ่ง:app.perform('routers')
ซึ่งดำเนินการ before
ตัวดัก "เราเตอร์" เพิ่ม app.routes
และดำเนินการ after
ตัวดัก "เราเตอร์"lib/preboots[.js]?
) ที่กำหนดไว้ใน (2) ข้างต้นlib/middlewares[.js]?
) ตามกำหนดเวลาใน (2) ด้านบนlib/routes[.js]?
) ตามกำหนดเวลาใน (2) ด้านบนapp.routes
App.prototype._listen
ถูกเรียกใช้ซึ่งจะสร้างเซิร์ฟเวอร์ http
และ/หรือ https
ใดๆafter
"เริ่มต้น" จะถูกเรียกใช้ (ดู: ผู้สกัดกั้นการศึกษา) slay
ไม่ได้ทำอะไรเลยตามค่าเริ่มต้นที่นี่callback
จาก app.start([options], callback);
ถูกเรียกใช้ ตอนนี้ app
เริ่มต้นและพร้อมใช้งานแล้ว npm test
เอ็มไอที