javascript - Abstracting Hapi17 routes using async await
问题描述
I am trying to get my head around the move to await/async in Hapi 17.
Mainly I am trying to work out how to rewrite an abstracted route to one that will work with async/await
The following is an extract from my routes\dogs.js
file
const DogController = require('../controllers/dog')
exports.plugin = {
name: 'dogs',
register: async (server, options) => {
server.route({
method: 'GET',
path: '/api/dogs',
handler: DogController.list
})
With the relevant extract from ../controllers/dog
exports.list = (req, h) => {
return Dog.find({}).exec().then((dog) => {
return { dogs: dog }
}).catch((err) => {
return { err: err }
})
}
Which currently returns a list of dogs from a MongoDB database at the moment. I'd like to rewrite the route so that the handler becomes something like
handler: async (request, h) => {
return DogController.list
}
But I'm assuming that the Controller itself is what needs to change.
解决方案
Route 中有一个options属性,您可以更改 Route 在请求生命周期中的行为。这意味着您可以创建一个对象并将其绑定到您的路由定义。
这是你的 dogs.js 路由插件。
exports.plugin = {
async register(server, options) {
const DogController = require('../controllers/dogs');
server.route([
{
method: 'GET',
path: '/dogs',
options: DogController.view
},
]);
},
name: 'dogs-route'
};
在这里,你的狗控制器。
exports.view = {
description: 'list all the good dogs',
handler: async (request, h) => {
return h.view('index', {'title': 'Home Page Title'});
try {
const dogs = await Dog.find({}).exec();
return {dogs};
}
catch(e){
// or something you want
return Boom.badRequest(e.message, e);
}
}
};
这是一个完整的示例,您可以分别检查路由和控制器。
推荐阅读
- c# - 如何将 Json 值从 React.JS 推送到 .NET 抽象类?
- bootstrap-flask - bootstrap-flask 的多文件字段处理
- github - PR 触发器不适用于 Azure DevOps 和 GitHub
- twitter - Twitter + spring social ,身份验证错误
- reactjs - 如何将我自己的 GeoJSON 数据添加到 Leaflet-realtime?
- kubernetes - k8s中如何判断一个节点是master还是worker?
- asp.net-core - 如何在 ASP.NET Core 中使用 opentelemetry 跟踪数据库操作?
- ios - 新类或结构的 Swift 文件
- angular - SVG / Angular:具有不同阴影的环
- javascript - javascript if..else 语句到 ? :