假设我想拥有大致如下所示的REST端点:
/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下,这是一个特定的项目。
有没有办法创建这种嵌套路由?
现在我有这样的东西:
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
})
但我正在寻找一种方法,嵌套项目路由到项目路由,并进一步通过项目的能力。
有什么建议吗?
发布于 2019-07-20 00:37:04
关于这样的基本要求,没有很好的信息。目前,我正在做以下工作&它工作得很好。
步骤1:在插件中包含路由,如下所示:
// server.js
const server = Hapi.server({ ... })
await server.register(require('./routes/projects'), { routes: { prefix: '/projects' } })
步骤2:在该插件的作用域内注册一个ext
。
// 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的功能了。
https://stackoverflow.com/questions/29143194
复制相似问题