You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.25 08:20:49