Hapi v16.x.x:如何将多个路由插件组合为单个插件
没问题!我来帮你把电影相关的路由拆分成独立文件,再组合成单个插件注册,这样代码结构会更清晰、易维护,后续新增或修改路由也更方便。
步骤1:拆分单个路由到独立文件
首先在movies目录下新建一个routes子文件夹,把每个路由单独放在一个文件里。比如:
movies/routes/get-movies.js
module.exports = { method: 'GET', path: '/movies', handler: (request, h) => { // 这里写获取电影列表的业务逻辑 return { data: ['星际穿越', '盗梦空间'] }; } };
movies/routes/create-movie.js
module.exports = { method: 'POST', path: '/movies', handler: (request, h) => { // 这里写创建新电影的业务逻辑 return { message: '电影创建成功', data: request.payload }; } };
你可以按照这个模式,把每个路由(比如更新、删除电影)都拆成单独的文件。
步骤2:创建聚合路由的插件
修改原来的movies/routes.js,让它变成一个聚合所有拆分路由的插件。这里分两种写法,适配不同版本的Hapi:
写法1:兼容旧版Hapi(使用回调)
// 导入所有拆分的路由文件 const getMovies = require('./routes/get-movies'); const createMovie = require('./routes/create-movie'); // 有更多路由的话,继续导入即可 exports.register = (server, options, next) => { // 批量注册所有路由 server.route([ getMovies, createMovie // 追加其他路由对象 ]); next(); // 必须调用next()告知插件加载完成 }; // 插件标识,Hapi要求必须添加 exports.register.attributes = { name: 'movieRoutes', version: '1.0.0' };
写法2:适配Hapi v17+(使用async/await)
如果你的项目用的是较新版本的Hapi,更推荐这种异步写法:
const getMovies = require('./routes/get-movies'); const createMovie = require('./routes/create-movie'); module.exports = { name: 'movieRoutes', version: '1.0.0', async register(server, options) { server.route([ getMovies, createMovie ]); } };
步骤3:保持原有的注册方式不变
你的server.js完全不需要修改,依然像之前一样注册movieRoutes插件就行:
const movieRoutes = require('./movies/routes'); server.register([ userRoutes, movieRoutes ], err => { ... server.start( err => { ... }); });
进阶优化:自动加载路由文件
如果后续路由文件很多,手动一个个导入太麻烦,可以用Node.js的fs和path模块自动加载routes目录下的所有路由文件:
const fs = require('fs'); const path = require('path'); module.exports = { name: 'movieRoutes', version: '1.0.0', async register(server, options) { const routesDir = path.join(__dirname, 'routes'); // 读取目录下所有.js后缀的文件 const routeFiles = fs.readdirSync(routesDir).filter(file => file.endsWith('.js')); // 批量导入并收集所有路由 const routes = routeFiles.map(file => require(path.join(routesDir, file))); server.route(routes); } };
这样新增路由文件后,不用修改routes.js,会自动被加载。
内容的提问来源于stack exchange,提问作者nazreen
相关产品推荐
相关产品推荐

