首页 > 解决方案 > 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.

标签: javascriptnode.jsasync-awaithapijs

解决方案


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);
        }
    }
};

是一个完整的示例,您可以分别检查路由和控制器。


推荐阅读