Skip to main content

HapiJS 17 的一些改變

Dev

我個人的確很喜歡 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;
}

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