Packhouse
Search…
Tool
Packhouse Tool

Property

const tool = {
install: 'function',
handler: 'function', // required
request: 'array',
response: 'string',
}

Install

第一次呼叫時執行,只會執行一次。
Install只允許同步執行,若執意使用非同步請求可以參閱Loader
const tool = {
install({ packhouse, store, include, utils, group }) { ... }
}

Packhouse

實例化的Packhouse對象,主要在於運用Plugin

Store

變數的容器,能在handler中被獲取。
const tool = {
install({ store }) {
store.demo = 5
},
handler(self) {
console.log(self.store.demo) // 5
}
}

Include

引用其他的Tool必須經過include,該接口也能引用其他GroupLine
const group = {
tools: {
sum: {
handler: (self, v1, v2) => self.success(v1 + v2)
},
double: {
install({ include }) {
// 參數一是引用名,第二個參數是tool name。
include('sum').tool('sum')
},
handler(self, v1) {
self.tool('sum')
.action(v1, v1, (error, result) => {
self.success(result)
})
}
}
}
}

Group

與Group交換資料的管道,也意味著能與外部的參數進行溝通:
const group = {
install(group, options) {
group.locale = options.locale
},
tools: {
where: {
install({ store, group }) {
store.locale = group.locale
},
handler(self) {
self.success(self.store.locale)
}
}
}
}
packhouse.addGroup('locale', () => {
return {
data: group,
options: {
locale: '台灣'
}
}
})
packhouse.tool('locale/where').action((error, result) => {
console.log(result) // '台灣'
})

Utils

可以使用Packhouse提供的工具組,詳情參照Utils

Handler

Tool被呼叫時的主執行續。
如果整個handler的過程是同步的,那action的執行是完全同步的,但建議把所有的行為視為非同步。
const tool = {
handler(self, ...args) {
self.success()
}
}

Self

主要的流程控制單元,固定在第一個參數上,以下是它的Property:

success

回傳成功結果

error

回傳錯誤結果

casting

回傳與驗證參數,詳情請參閱Mold Casting

line

引用includeLine。

tool

引用include的Tool。

assess

驗證第一個參數是否為null或undefined,若不是則回傳第一個參數,若成立則回傳第二個參數。
assess可以接受一個Callback,當第二個參數成立時可觸發並回傳該方法的結果。
const group = {
tools: {
sum: {
request: ['number', 'number'],
handler: (self, v1, v2) => self.success(v1 + v2)
},
doubleAndToInt: {
install({ include }) {
include('sum').tool('sum')
},
handler(self, v1) {
self.tool('sum')
.action(v1, v1, self.assess(result => parseInt(result)))
}
}
}
}
// ... 省略註冊行為
packhouse.tool('math/doubleAndToInt').action(10.2, (error, result) => {
console.log(result) // 20
})
packhouse.tool('math/doubleAndToInt').action('10.2', (error, result) => {
console.log(error != null) // true
})

Lazy First

在Cloud Function的型態下,我們只要專注在單一功能上,意味著每次執行只要針對目的require所需的模塊即可。
並不建議將require的行為建立在install的行為內,除了可讀性差之外也可能造成this指向錯誤或影響單元測試等行為。
// 這是個糟糕的例子😢
let moment = require('moment')
const badTool = {
handler(self) {
self.success(moment())
}
}
// 這是個優良案例 🤣
const tool = {
handler(self) {
let moment = require('moment')
self.success(moment())
}
}

Async

Install必須是同步的,但Handler允許非同步運作。
const tool = {
handler: async self => setTimeout(self.success, 100)
}

Request & Response

指定參數與回傳值的型態與驗證對象,比對方法詳情請參照Mold
const tools = {
sum: {
request: ['number', 'number'],
response: 'number',
handler(self, v1, v2) {
self.success(v1 + v2)
}
}
}
Last modified 2yr ago
Copy link
On this page
Property
Install
Handler
Self
Lazy First
Async
Request & Response