我应该如何在Hapi中使用Swagger?

时间:2016-03-14 14:26:26

标签: node.js swagger hapijs

我有一个普通的Hapi应用程序,我计划迁移到Swagger。我使用官方说明安装了swagger-node,并在执行' swagger project create'时选择Hapi。但是,我现在很困惑,因为似乎有几个用于集成swagger-node和hapi的库:

  1. hapi-swagger:最受欢迎的
  2. hapi-swaggered:有点受欢迎
  3. swagger-hapi:不受欢迎且不活跃,但由官方Swagger Node.js库(即swagger-node)用作Hapi项目的默认值
  4. 我虽然swagger-hapi是"官员"方法,直到我试图找到关于如何在Hapi路线上进行各种配置的信息(例如授权,范围等)。似乎这些方法根本不同,swagger-hapi将Swagger定义作为输入并自动生成路径,而hapi-swagger和hapi-swaggered似乎通过仅从普通的旧Hapi生成Swagger API文档而具有相似的方法路线定义。

    考虑到贡献者的数量和下载次数,hapi-swagger似乎是要走的路,但我不确定如何继续。是否有#34;官员" Swagger设置Hapi的方式,如果有,我如何设置身份验证(最好是使用hapi-auth-jwt2或其他类似的JWT解决方案)和授权?

    编辑:我还发现swaggerize-hapi,这似乎是由PayPal的开源kraken.js团队维护的,这表明它可能有某种企业支持(总是一件好事)。 swaggerize-hapi似乎与hapi-swagger非常相似,虽然后者似乎提供了更多开箱即用的功能(主要是Swagger Editor)。

3 个答案:

答案 0 :(得分:9)

修改:从问题中得出第3点并了解swagger-hapi实际执行的操作非常重要。它没有直接服务于swagger-ui html。它不打算,但它启用了整个招摇的想法(第1点和第2点中的其他项目实际上有点逆转)。请参阅下文。

事实证明,当您使用swagger-nodeswagger-hapi时,除了直接使用swagger-ui(所有人都使用)之外,您不需要提到的所有其他软件包反正其他人 - 他们把它包装在他们的依赖中)

到目前为止,我想在这个hapi / swagger拼图中分享我的理解,希望我花了8个小时也可以帮助其他人。

hapi-swaggeredhapi-swaggered-ui等图书馆,hapi-swagger - 所有图书馆都遵循相同的方法 - 可能会这样描述:

You document your API while you are defining your routes

他们有点撇开swagger-node的主要思想和用swagger-cli创建的样板文件hello_world项目,你提到过你使用过它。

虽然swagger-nodeswagger-hapi(请注意,它与hapi-swagger不同)说:

You define all your API documentation and routes **in a single centralized place - swagger.yaml**

然后你只专注于编写控制器逻辑。随swagger-cli提供的样板项目已经暴露了这个集中的地方swagger.yaml作为json通过/ swagger端点。

现在,因为所有上述软件包都用于显示UI的swagger-ui项目,只是一堆静态html - 为了使用它,你有两个选择:

  • 1)从你的应用程序中自我托管这个静态html

  • 2)将其托管在单独的网络应用上,甚至直接从文件系统加载index.html。

在这两种情况下,你只需要用你的swagger json来提供swagger-ui - 如上所述已经被/swagger端点暴露了。

如果您选择选项2),唯一需要注意的是您需要为该终点启用cors,这恰好非常容易。只需更改你的default.yaml,也可以使用cors bagpipe。有关如何执行此操作,请参阅此thread

正如@Kitanotori上面所说,我也没有看到以编程方式记录代码的重点。只需在一个地方描述所有内容并使代码和文档引擎都能理解它的想法非常棒。

答案 1 :(得分:1)

我们已经使用了Inert,Vision和hapi-swagger。

server.ts

import * as Inert from '@hapi/inert';
import * as Vision from '@hapi/vision';
import Swagger from './plugins/swagger';
...
...
// hapi server setup
...
const plugins: any[] = [Inert, Vision, Swagger];
await server.register(plugins);
...
// other setup

./ plugins / swagger

import * as HapiSwagger from 'hapi-swagger';

import * as Package from '../../package.json';

const swaggerOptions: HapiSwagger.RegisterOptions = {
  info: {
    title: 'Some title',
    version: Package.version
  }
};

export default {
  plugin: HapiSwagger,
  options: swaggerOptions
};

答案 2 :(得分:0)

我们正在使用Inert,Vision和hapi-swagger来构建和托管swagger文档。 我们将按此顺序加载这些插件,不配置Inert或Vision,而仅在hapi-swagger配置中设置基本属性(如title)。