HapiJS 17 的一些改變

hapi Nov 19, 2017

我個人的確很喜歡 hapi 這個 server framework。V17 版本的升級的確有點蛋疼,完全擁抱 async/await 的 ES2017(2018❓) 語法。反正,Node 8 已經原生支持這個語法了,所以 Hapi 也只支持 Node 8+。

改變 1 - server method

request.pre 去掉了 String 的使用方式。新的 prerequisite 正確使用方法:用 arrow function。

V16 server route 例子

{
  validate: {
    query: false,
    params: {
      yo: Joi.string().valid(['lo']).required()
    }
  },
  pre: [
    { method: "hello(params.yo)", assign: "yolo" }
  ],
  handler: (request, reply) => {
      // ...
  }
}

V17 server route 例子

// server.route 的 config 變成 options

server.route({
    path: "/lalala/{yo}",
    method: "get",
    options: {
        validate: {
            params: {
              yo: Joi.string().valid(['lo']).required()
            }
        },
        pre: [{
          method: request => request.server.methods.hello(request.params.yo),
          assign: 'yolo'
        }],
        handler: async (request, h) => {
            // ...
        }
    }
})

/*
 * 註冊 server method 沒什麼改變,緩存只是多了 `getDecoratedValue`,否則返回的不會 cached 的資料。
 **/
server.method('hello', async (requestPrams) => {
    try {
        const res = await http.getSomething(requestPrams);
        return res.data;
    } catch (error) {
        throw Boom.badGateway(error);
    }
}, {
    // server method cache
    cache: {
        expiresIn: 7.2e6, // 2 hrs
        generateTimeout: 2500, // 2.5 sec
        getDecoratedValue: true
    }
})

Tips:記得 try/catch。

2 - Bounce

https://github.com/hapijs/bounce

Async/Await 的引起一些麻煩,就是錯誤會沉默吞噬掉。

async function(user) {
    try {
        await doSomethingAsync(user);
    } catch(err) {
        // blah 錯誤,沉默吞噬
    }
    return user;
}

解決問題方法就是用 Bounce:

async function(user) {
    try {
        await doSomethingAsync(user);
    } catch(err) {
        // fix
        Bounce.rethrow(err, 'system');
    }
    return user;
}

📒:今天就寫這麼多,容後再添加。

Wai Tsang

💥8➕26.