首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >Hapi嵌套路由

Hapi嵌套路由
EN

Stack Overflow用户
提问于 2015-03-19 19:18:14
回答 1查看 2.9K关注 0票数 20

假设我想拥有大致如下所示的REST端点:

代码语言:javascript
复制
/projects/
/projects/project_id 

/projects/project_id/items/
/projects/project_id/items/item_id

每个if上的CRUD都是有意义的。例如,/projects POST创建了一个新项目,GET获取所有项目。/projects/ project _id GET只获取这一个项目。

项是特定于项目的,所以我将它们放在project_id下,这是一个特定的项目。

有没有办法创建这种嵌套路由?

现在我有这样的东西:

代码语言:javascript
复制
  server.route({
    method: 'GET',
    path: '/projects',
    handler: getAllProjects
  });

  server.route({
    method: 'GET',
    path: '/projects/{project_id}',
    handler: getOneProject
  });

  server.route({
    method: 'GET',
    path: '/projects/{project_id}/items/{item_id}',
    handler: getOneItemForProject
  });

  server.route({
    method: 'GET',
    path: '/projects/{project_id}/items',
    handler: getAllItemsForProject
  })

但我正在寻找一种方法,嵌套项目路由到项目路由,并进一步通过项目的能力。

有什么建议吗?

EN

回答 1

Stack Overflow用户

发布于 2019-07-20 00:37:04

关于这样的基本要求,没有很好的信息。目前,我正在做以下工作&它工作得很好。

步骤1:在插件中包含路由,如下所示:

代码语言:javascript
复制
// server.js
const server = Hapi.server({ ... })
await server.register(require('./routes/projects'), { routes: { prefix: '/projects' } })

步骤2:在该插件的作用域内注册一个ext

代码语言:javascript
复制
// routes/projects/index.js
module.exports = {

    name: 'projects',

    async register(server) {

        server.route({
            method: 'get',
            path: '/', // note: you don't need to prefix with `projects`
            async handler(request, h) {
                return [ ... ]
            }
        })

        server.route({
            method: 'get',
            path: '/{projectId}', // note: you don't need to prefix with `projects`
            async handler(request, h) {
                return { ... }
            }
        })

        server.ext({
            // https://hapijs.com/api#request-lifecycle
            type: 'onPostAuth',
            options: {
                // `sandbox: plugin` will scope this ext to this plugin
                sandbox: 'plugin'
            },
            async method (request, h) {
                // here you can do things as `pre` steps to all routes, for example:
                // verify that the project `id` exists
                if(request.params.projectId) {
                    const project = await getProjectById(request.params.projectId)
                    if(!project) {
                        throw Boom.notFound()
                    }
                    // Now request.params.project can be available to all sub routes
                    request.params.project = project
                }
                return h.continue
            }
        })

    }

}

这已经接近于我能够重新创建Express Router的功能了。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/29143194

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档