node.js - 无法将 hapi-swagger 注册到 hapi rest api 最新版本 17

标签 node.js rest hapi.js hapi-swagger

我一年前使用以下版本的 hapihapi-swagger 创建了一个 REST API。

hapi: "8.5.1",
hapi-swagger: "0.7.3"

为了注册 hapi-swagger,我使用了以下注册选项:

server.register([{
    register: require('hapi-swagger'),
    options: {
        apiVersion: "0.0.1"
    }
}], function (err) {
    if (err) {
        server.log(['error'], 'hapi-swagger load error: ' + err)
    } else {
        server.log(['start'], 'hapi-swagger interface loaded')
    }
});  

它在上述版本和代码中运行良好。我想到将两者都更新到最新版本,并更新到以下版本:

hapi: "17.0.2",
hapi-swagger: "8.0.0"

更新后,当我尝试运行服务器时,我收到以下错误:

Exception has occurred: AssertionError
AssertionError: Invalid register options "value" must be an object
    at Object.exports.apply (/Users/karthik/Desktop/new_gem/es6/CriApi/node_modules/hapi/lib/config.js:22:10)
    at internals.Server.register (/Users/karthik/Desktop/new_gem/es6/CriApi/node_modules/hapi/lib/server.js:332:26)
    at Object.<anonymous> (/Users/karthik/Desktop/new_gem/es6/CriApi/server.js:7:8)
    at Module._compile (module.js:632:14)
    at Object.Module._extensions..js (module.js:646:10)
    at Module.load (module.js:554:32)
    at tryModuleLoad (module.js:497:12)
    at Function.Module._load (module.js:489:3)
    at Function.Module.runMain (module.js:676:10)
    at startup (bootstrap_node.js:187:16)
    at bootstrap_node.js:608:3

我用谷歌搜索了一下,发现了一篇解释hapi v17 Upgrade Guide的文章,指定注册插件如下:

// register plugins, wrapped in async/await
async function liftOff () {  
  await server.register({
    plugin: require('hapi-swagger')
  })

  server.views(…)
}
liftOff()

// or

// register plugins using a promise
server.register({  
  plugin: require('hapi-swagger')
}).then(() => { server.views(…) })

我尝试了两者,但现在出现以下错误:

Exception has occurred: AssertionError
AssertionError: Invalid plugin options {
  "plugin": {
    "register": function (plugin, options, next) {\n\n\n    let settings = Hoek.applyToDefaults(Defaults, options, true);\n    const publicDirPath = Path.resolve(__dirname, '..', 'public');\n    const swaggerDirPath = Path.join(publicDirPath, 'swaggerui');\n\n    settings.log = (tags, data) => {\n\n        tags.unshift('hapi-swagger');\n        if (settings.debug) {\n            plugin.log(tags, data);\n        }\n    };\n    settings.log(['info'], 'Started');\n\n    // add server method for caching\n    if (settings.cache) {\n        // set default\n        settings.cache.segment = 'hapi-swagger';\n        if (!settings.cache.generateTimeout) {\n            settings.cache.generateTimeout = 30 * 1000;\n        }\n\n        plugin.method('getSwaggerJSON', Builder.getSwaggerJSON, {\n            cache: settings.cache,\n            generateKey: () => {\n\n                return 'hapi-swagger';\n            }\n        });\n    }\n\n\n    // add routing swagger json\n    plugin.route([{\n        method: 'GET',\n        path: settings.jsonPath,\n        config: {\n            auth: settings.auth,\n            cors: settings.cors,\n            handler: (request, reply) => {\n\n                Joi.assert(settings, schema);\n\n                if (settings.cache) {\n                    /*eslint no-unused-vars:0 */\n                    plugin.methods.getSwaggerJSON(settings, request, (err, json, cached, report) => {\n\n                        /* $lab:coverage:off$ */\n                        if (err) {\n                            reply(err);\n                            /* $lab:coverage:on$ */\n                        } else {\n                            //console.log(JSON.stringify(report));\n                            const lastModified = cached ? new Date(cached.stored) : new Date();\n                            reply(json).header('last-modified', lastModified.toUTCString());\n                        }\n                    });\n                } else {\n                    Joi.assert(settings, schema);\n                    Builder.getSwaggerJSON(settings, request, (err, json) => {\n\n                        reply(json);\n                    });\n                }\n            },\n            plugins: {\n                'hapi-swagger': false\n            }\n        }\n    }]);\n\n\n    // only add 'inert' and 'vision' based routes if needed\n    if (settings.documentationPage === true || settings.swaggerUI === true) {\n\n        // make sure we have other plug-in dependencies\n        plugin.dependency(['inert', 'vision'], (pluginWithDependencies, nextWithDependencies) => {\n\n            // add routing for swaggerui static assets /swaggerui/\n            pluginWithDependencies.views({\n                engines: {\n                    html: {\n                        module: require('handlebars')\n                    }\n                },\n                path: swaggerDirPath\n            });\n\n            // add documentation page\n            if (settings.documentationPage === true) {\n                pluginWithDependencies.route([{\n                    method: 'GET',\n                    path: settings.documentationPath,\n                    config: {\n                        auth: settings.auth\n                    },\n                    handler: (request, reply) => {\n\n                        reply.view('index.html', {});\n                    }\n                }]);\n            }\n\n            // add swagger UI if asked for or need by documentation page\n            if (settings.documentationPage === true || settings.swaggerUI === true) {\n                pluginWithDependencies.route([{\n                    method: 'GET',\n                    path: settings.swaggerUIPath + '{path*}',\n                    config: {\n                        auth: false\n                    },\n                    handler: {\n                        directory: {\n                            path: swaggerDirPath + Path.sep,\n                            listing: true,\n                            index: false\n                        }\n                    }\n                }, {\n                    method: 'GET',\n                    path: settings.swaggerUIPath + 'extend.js',\n                    config: {\n                        auth: false,\n                        files: {\n                            relativeTo: publicDirPath\n                        }\n                    },\n                    handler: {\n                        file: 'extend.js'\n                    }\n                }]);\n            }\n\n            // add debug page\n            if (settings.debug === true) {\n                pluginWithDependencies.route([{\n                    method: 'GET',\n                    path: Path.join(settings.documentationPath, Path.sep, 'debug').split(Path.sep).join('/'),\n                    config: {\n                        auth: settings.auth\n                    },\n                    handler: (request, reply) => {\n\n                        reply.view('debug.html', {}).type('application/json');\n                    }\n                }]);\n            }\n\n            appendDataContext(pluginWithDependencies, settings);\n\n            nextWithDependencies();\n\n        });\n    }\n\n    // TODO: need to work how to test this as it need a request object\n    // Undocument API interface, it may change\n    /* $lab:coverage:off$ */\n    plugin.expose('getJSON', function (exposeOptions, request, callback) {\n\n        // use either options passed to function or plug-in scope options\n        let exposeSettings = {};\n        if (exposeOptions && Utilities.hasProperties(exposeOptions)) {\n            exposeSettings = Hoek.applyToDefaults(Defaults, exposeOptions);\n            Joi.assert(exposeSettings, schema);\n        } else {\n            exposeSettings = Hoek.clone(settings);\n        }\n        Builder.getSwaggerJSON(exposeSettings, request, callback);\n    });\n    /* $lab:coverage:on$ */\n\n\n    next();\n},
    [41m"name"[0m[31m [1]: -- missing --[0m
  }
}
[31m
[1] "name" is required[0m
    at Object.exports.apply (/Users/karthik/Desktop/new_gem/es6/CriApi/node_modules/hapi/lib/config.js:22:10)
    at internals.Server.register (/Users/karthik/Desktop/new_gem/es6/CriApi/node_modules/hapi/lib/server.js:364:31)
    at liftOff (/Users/karthik/Desktop/new_gem/es6/CriApi/server.js:30:18)
    at Object.<anonymous> (/Users/karthik/Desktop/new_gem/es6/CriApi/server.js:36:1)
    at Module._compile (module.js:632:14)
    at Object.Module._extensions..js (module.js:646:10)
    at Module.load (module.js:554:32)
    at tryModuleLoad (module.js:497:12)
    at Function.Module._load (module.js:489:3)
    at Function.Module.runMain (module.js:676:10)
    at startup (bootstrap_node.js:187:16)
    at bootstrap_node.js:608:3

我尝试了上面代码的所有排列和组合。目前什么都不起作用。任何帮助将不胜感激。

最佳答案

Hapi-Swagger 版本 > 9.x 支持 Hapi v17:https://github.com/glennjones/hapi-swagger

关于node.js - 无法将 hapi-swagger 注册到 hapi rest api 最新版本 17,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47430641/

相关文章:

arrays - 如何在 native react 中将json数据与数组映射

java - 在我的 REST 客户端中获取 REST 服务数据

hapi.js - 是否可以在 reply.file() 中手动设置内容类型 header ?

node.js - 如何使用mongodb Node 包在mapReduce中打印

node.js - Node.js 要求浏览器重新加载页面

android - Android 将请求流式传输到 Node 服务器的奇怪问题

.net - ArrayOf 将 List<T> 与 WCF 休息服务一起使用时

node.js - 将请求 header 添加到 Node 中的 Azure Application Insights 事件

javascript - 由于待处理的 MongoDB 连接(@hapi/lab、mongodb-memory-server、node),测试未完成

javascript - Node.js 版本冲突