我個人的確很喜歡 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;
}
📒:今天就寫這麼多,容後再添加。