WServHapiServer

WServHapiServer

new WServHapiServer(optopt) → {Object}

Description:
  • Hapi伺服器端之資料控制與同步器

Source:
Example
import fs from 'fs'
import _ from 'lodash-es'
import WOrm from 'w-orm-mongodb/src/WOrmMongodb.mjs'
import WServHapiServer from './src/WServHapiServer.mjs'


async function run() {

    //optWOrm
    let optWOrm = {
        url: 'mongodb://username:password@127.0.0.1:27017',
        db: 'servhapi',
        cl: '',
    }

    //tableNamesExec, tableNamesSync
    let tableNamesExec = ['tabA', 'tabB']
    let tableNamesSync = ['tabA']

    //woItems
    let woItems = {}
    for (let k in tableNamesExec) {
        let v = tableNamesExec[k]
        let opt = { ...optWOrm, cl: v }
        let wo = new WOrm(opt)
        woItems[v] = wo
    }

    async function saveData(cl, r) {

        //w
        let w = woItems[cl] //一定要由woItems操作, 否則傳woItems進去WServHapiServer會無法收到change事件

        //save
        await w.save(r, { atomic: true }) //autoInsert: false
            .then(function(msg) {
                console.log('save then', cl, msg)
            })
            .catch(function(msg) {
                console.log('save catch', cl, msg)
            })

    }

    let r
    r = [
        {
            id: 'id-tabA-peter',
            name: 'peter',
            value: 123,
        },
        {
            id: 'id-tabA-rosemary',
            name: 'rosemary',
            value: 123.456,
        },
        {
            id: 'id-tabA-kettle',
            name: 'kettle',
            value: 456,
        },
    ]
    await saveData('tabA', r)
    r = [
        {
            id: 'id-tabB-peter',
            name: 'peter',
            value: 123,
        },
        {
            id: 'id-tabB-rosemary',
            name: 'rosemary',
            value: 123.456,
        },
    ]
    await saveData('tabB', r)

    let n = 0
    let tn = setInterval(() => {
        n++
        console.log('update tabA', n)
        r = {
            id: 'id-tabA-peter',
            name: 'peter',
            value: Math.random(),
        }
        saveData('tabA', r)
        if (n >= 5) {
            clearInterval(tn)
        }
    }, 3000)

    let procCommon = async (userId, tableName, methodName, input) => {
        // console.log('procCommon call', tableName, methodName, input)
        let r = await woItems[tableName][methodName](input)
        // console.log('procCommon result', r)
        return r
    }

    let uploadFile = async (userId, { name, u8a }) => {
        console.log('uploadFile', userId, name, _.size(u8a))
        fs.writeFileSync(name, Buffer.from(u8a))
        console.log('uploadFile writeFileSync finish')
        return 'finish'
    }

    //WServHapiServer
    let instWServHapiServer = new WServHapiServer({
        port: 8080,
        apis: [],
        getUserIDFromToken: async (token) => { //可使用async或sync函數
            return 'id-for-admin'
        },
        useDbORM: true,
        dbORMs: woItems,
        operORM: procCommon, //procCommon的輸入為: userId, tableName, methodName, input
        tableNamesExec,
        methodsExec: ['select', 'insert', 'save', 'del'],
        tableNamesSync,
        extFuncs: { //接收參數第1個為userId, 之後才是前端給予參數
            uploadFile,
            // getUserFromID,
            // downloadFileFromID,
            // saveTableAndData,
            //...
        },
        hookBefores: null,
        hookAfters: null,
        // fnTableTags: 'tableTags-serv-hapi.json',
    })

    instWServHapiServer.on('error', (err) => {
        console.log(err)
    })

}
run()

// save then tabA [
//     { n: 1, nModified: 1, ok: 1 },
//     { n: 1, nModified: 1, ok: 1 },
//     { n: 1, nModified: 1, ok: 1 }
// ]
// save then tabB [ { n: 1, nModified: 1, ok: 1 }, { n: 1, nModified: 1, ok: 1 } ]
// Server running at: http://localhost:8080
// Server[port:8080]: open
// update tabA
// save then tabA [ { n: 1, nModified: 1, ok: 1 } ]
// repeat...
Parameters:
Name Type Attributes Default Description
opt Object <optional>
{}

輸入設定物件,預設{}

Properties
Name Type Attributes Default Description
port Integer <optional>
8080

輸入Hapi伺服器通訊port,預設8080

useCors Boolean <optional>
true

輸入是否API可跨域呼叫,預設true

useInert Boolean <optional>
true

輸入是否使用@hapi/inert取得指定資料夾下所有靜態檔案,預設true

pathStaticFiles String <optional>
'dist'

輸入當useInert=true時指定伺服器資料夾名稱,預設'dist'

apis Array <optional>
[]

輸入Hapi伺服器設定API陣列,預設[]

getUserIDFromToken function <optional>
async ()=>''

輸入取得使用者ID的回調函數,傳入參數為各函數的原始參數,預設async ()=>''

useDbORM Boolean <optional>
true

輸入是否使用資料庫ORM技術,給予false代表不使用直接存取資料庫函數與自動同步資料庫至前端功能,預設true

dbORMs Object <optional>
{}

輸入各資料表的操作物件,用以提供由tableNamesSync指定資料表的change事件,使能監聽與觸發資料變更事件,key為表名而值為該表的操作器實體,操作器實體可使用例如WOrmMongodb等建立,預設{}

operORM function <optional>
{}

輸入各資料表的操作通用接口物件,用以提供操作由tableNamesExec指定資料表的例如'select'、'insert'、'save'、'del'函數。加上由extFuncs提供的函數,就為全部可由前端執行的函數,預設{}

tableNamesExec Array <optional>
[]

輸入指定能被操作的表名陣列,預設[]

methodsExec Array <optional>
['select','insert','save','del']

輸入指定綁定操作器的方式陣列,可選'select'、'insert'、'save'、'del'、'delAll',預設['select', 'insert', 'save', 'del']

tableNamesSync Array <optional>
[]

輸入指定能被同步的表名陣列,預設[]

extFuncs Object <optional>
null

輸入額外擴充執行函數物件,key為函數名而值為函數,預設null

hookBefores function <optional>
null

輸入執行函數的前攔截函數,預設null

hookAfters function <optional>
null

輸入執行函數的後攔截函數,預設null

showLog Boolean <optional>
true

輸入是否使用console.log顯示基本資訊布林值,預設true

Returns:

回傳物件,其內server為hapi伺服器實體,wsrv為w-converhp的伺服器事件物件,wsds為w-serv-webdata的伺服器事件物件,可監聽error事件

Type
Object