From dff83a9a38ec144eafbf8f64dd2df606ea97651a Mon Sep 17 00:00:00 2001 From: npmrun Date: Thu, 17 Jun 2021 00:24:50 +0800 Subject: [PATCH] =?UTF-8?q?404,=E8=B7=AF=E7=94=B1=E4=BC=98=E5=8C=96?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .env | 2 +- package.json | 2 +- packages/hapi-router/dist/hapi-router.cjs.js | 36 ++++++++++++++++++++-- packages/hapi-router/dist/hapi-router.cjs.js.map | 2 +- packages/hapi-router/package.json | 3 ++ packages/hapi-router/pnpm-lock.yaml | 38 ++++++++++++++++++++++++ packages/hapi-router/rollup.config.js | 1 + packages/hapi-router/src/index.ts | 13 ++++++-- source/route/index/index.ts | 9 ++++-- source/route/route.txt | 1 + source/run.ts | 31 +++++++++---------- template/404.ejs | 1 + 12 files changed, 115 insertions(+), 24 deletions(-) create mode 100644 template/404.ejs diff --git a/.env b/.env index 8053ff5..b02dcf3 100644 --- a/.env +++ b/.env @@ -1,3 +1,3 @@ NODE_ENV=development - +# https://www.bookstack.cn/read/hapijs-zh/2f6997ac6d3fb529.md KEY = dsRhw1Y5UZqB8SjfClbkrX9PF7yuDMV3JItcW0G4vgpaxONo6mzenHLQET2AiKyPUjjdDko10amjPaba diff --git a/package.json b/package.json index 6656f9a..30dab50 100644 --- a/package.json +++ b/package.json @@ -7,7 +7,7 @@ "scripts": { "init": "npx ts-node --project ./tsconfig.json -r tsconfig-paths/register source/db/init.ts alter", "start": "npx ts-node-dev --project ./tsconfig.json -r tsconfig-paths/register ./source/main.ts", - "temp": "nodemon --exec 'npx ts-node-dev -r tsconfig-paths/register ./source/main.ts'" + "dev": "nodemon --exec 'npx ts-node --project ./tsconfig.json -r tsconfig-paths/register ./source/main.ts'" }, "keywords": [], "author": "", diff --git a/packages/hapi-router/dist/hapi-router.cjs.js b/packages/hapi-router/dist/hapi-router.cjs.js index aa15b96..de65ad5 100644 --- a/packages/hapi-router/dist/hapi-router.cjs.js +++ b/packages/hapi-router/dist/hapi-router.cjs.js @@ -3,6 +3,30 @@ Object.defineProperty(exports, '__esModule', { value: true }); +var Joi = require('joi'); + +function _interopNamespace(e) { + if (e && e.__esModule) return e; + var n = Object.create(null); + if (e) { + Object.keys(e).forEach(function (k) { + if (k !== 'default') { + var d = Object.getOwnPropertyDescriptor(e, k); + Object.defineProperty(n, k, d.get ? d : { + enumerable: true, + get: function () { + return e[k]; + } + }); + } + }); + } + n['default'] = e; + return Object.freeze(n); +} + +var Joi__namespace = /*#__PURE__*/_interopNamespace(Joi); + /*! ***************************************************************************** Copyright (c) Microsoft Corporation. @@ -204,8 +228,16 @@ var routePlugin = (function () { } } if (!options_1.validate) { - if (ff.$validate) { - options_1.validate = ff.$validate; + var validateObj = ff.$validate || {}; + if (options_1.auth) { + validateObj = Object.assign(validateObj, { + headers: Joi__namespace.object({ + Authorization: Joi__namespace.string(), + }).unknown(), + }); + } + if (validateObj) { + options_1.validate = validateObj; } } if (ff.$swagger && route.startsWith("/api")) { diff --git a/packages/hapi-router/dist/hapi-router.cjs.js.map b/packages/hapi-router/dist/hapi-router.cjs.js.map index 64a0da2..0a4504f 100644 --- a/packages/hapi-router/dist/hapi-router.cjs.js.map +++ b/packages/hapi-router/dist/hapi-router.cjs.js.map @@ -1 +1 @@ -{"version":3,"file":"hapi-router.cjs.js","sources":["../src/util/index.ts","../src/util/decorators.ts","../src/index.ts"],"sourcesContent":["// @ts-nocheck\n\nconst path = require(\"path\")\nconst fs = require(\"fs\")\n\nexport function removeIndex(ss:any) {\n const remove = (str:any) => {\n if (str.endsWith(\"/index\")) {\n return str.slice(0, -6);\n }\n if (str.endsWith(\"index\")) {\n return str.slice(0, -5);\n }\n return str ? str : \"/\";\n };\n let r = true;\n let rr = ss;\n while (r) {\n if (rr.endsWith(\"/index\")) {\n rr = remove(rr);\n } else {\n r = false;\n }\n }\n return rr ? rr : \"/\";\n}\n\nexport function isIndexEnd(str:any) {\n return str.length == 1 && str.endsWith(\"/\");\n}\n\n\nexport function walkDir(\n filePath:any,\n exclude = [\"node_modules\", \"^_\", \".git\", \".idea\", \".gitignore\", \"client\",\"\\.txt$\"]\n) {\n let files:any[] = [];\n function Data(opts:any) {\n this.relativeDir = opts.relativeDir;\n this.relativeFile = opts.relativeFile;\n this.filename = opts.filename;\n this.file = opts.file;\n this.absoluteFile = opts.absoluteFile;\n this.relativeFileNoExt = opts.relativeFileNoExt;\n this.absoluteDir = opts.absoluteDir;\n }\n function readDir(filePath, dirname = \".\") {\n let res = fs.readdirSync(filePath);\n res.forEach((filename) => {\n const filepath = path.resolve(filePath, filename);\n const stat = fs.statSync(filepath);\n const name = filepath.split(path.sep).slice(-1)[0];\n if (typeof exclude === \"string\" && new RegExp(exclude).test(name)) {\n return;\n }\n if (Array.isArray(exclude)) {\n for (let i = 0; i < exclude.length; i++) {\n const excludeItem = exclude[i];\n if (new RegExp(excludeItem).test(name)) {\n return;\n }\n }\n }\n if (!stat.isFile()) {\n readDir(filepath, dirname + path.sep + name);\n } else {\n const data = new Data({\n relativeDir: dirname,\n relativeFile: dirname + path.sep + path.parse(filepath).base,\n relativeFileNoExt: dirname + path.sep + path.parse(filepath).name,\n file: path.parse(filepath).base,\n filename: path.parse(filepath).name,\n absoluteFile: filepath,\n absoluteDir: path.parse(filepath).dir,\n });\n files.push(data);\n }\n });\n }\n readDir(filePath);\n return files;\n}\n","// @ts-nocheck\n\nexport function method(opts?:string|Array) {\n return function (target, propertyKey: string, descriptor: PropertyDescriptor) {\n target[propertyKey].$method = opts\n }\n}\nexport function route(route?:string) {\n return function (target, propertyKey: string, descriptor: PropertyDescriptor) {\n target[propertyKey].$route = route\n }\n}\n\nexport function config(options:Object) {\n return function (target, propertyKey: string, descriptor: PropertyDescriptor) {\n target[propertyKey].$options = options\n }\n}\n\nexport function auth(isAuth:boolean = true) {\n return function (target, propertyKey: string, descriptor: PropertyDescriptor) {\n target[propertyKey].$auth = isAuth\n }\n}\n\nexport function validate(validate:Object) {\n return function (target, propertyKey: string, descriptor: PropertyDescriptor) {\n target[propertyKey].$validate = validate\n }\n}\n\nexport function swagger(desc,notes,tags) {\n return function (target, propertyKey: string, descriptor: PropertyDescriptor) {\n target[propertyKey].$swagger = [desc,notes,tags]\n }\n}\n","// @ts-nocheck\n\nimport { walkDir, removeIndex, isIndexEnd } from \"./util\";\nconst path = require(\"path\")\nconst fs = require(\"fs\")\n\nconst routes = [\"所有路由路径:\"];\n\nclass routePlugin {\n public name: string = \"routePlugin\";\n public version: string = \"0.0.1\";\n public register(server: any, options: any) {\n const sourceDir = options.sourceDir;\n\n const files = walkDir(sourceDir);\n files.forEach((file) => {\n let filename = file.relativeFileNoExt;\n let array = filename.split(path.sep).slice(1);\n let fileNoExt = removeIndex(\"/\" + array.join(\"/\"));\n const moduleName = path.resolve(sourceDir, filename);\n const obj = require(moduleName);\n if (obj.default) {\n const func = new (obj.default || obj)();\n const prototype = Object.getPrototypeOf(func);\n const keys = Reflect.ownKeys(prototype);\n for (const key of keys) {\n if (key !== \"constructor\") {\n let ff = func[key];\n // 默认方法\n const method = ff.$method || \"GET\";\n // 路由收集规则\n let route = \"\";\n if (ff.$route) {\n if (isIndexEnd(fileNoExt)) {\n route = ff.$route;\n } else {\n route = fileNoExt + ff.$route;\n }\n } else {\n if (isIndexEnd(fileNoExt)) {\n route = fileNoExt + key.toString();\n } else {\n route = fileNoExt + \"/\" + key.toString();\n }\n }\n route = removeIndex(route);\n // 配置规则\n const options = ff.$options ? ff.$options : {};\n if (!options.auth) {\n if (ff.$auth == undefined) {\n if (route.startsWith(\"/api\")) {\n options.auth = \"jwt\";\n } else {\n options.auth = false;\n }\n } else if (ff.$auth) {\n options.auth = \"jwt\";\n } else {\n options.auth = false;\n }\n }\n if (!options.validate) {\n if (ff.$validate) {\n options.validate = ff.$validate;\n }\n }\n if (ff.$swagger && route.startsWith(\"/api\")) {\n options.description = ff.$swagger[0];\n options.notes = ff.$swagger[1];\n options.tags = ff.$swagger[2];\n }\n let str = route;\n if (options.auth) {\n str += \" 该路由需要权限\";\n } else {\n str += \" 该路由不需要权限\";\n }\n routes.push(str);\n server.route({\n method: method,\n path: route,\n handler: ff,\n options: options,\n });\n }\n }\n }\n });\n fs.writeFileSync(path.resolve(sourceDir, \"route.txt\"), routes.join(\"\\n\"), {\n encoding: \"utf-8\",\n });\n }\n}\n\nconst plugin = new routePlugin();\n\nexport { plugin };\nexport * from \"./util/decorators\";\n"],"names":["path","fs"],"mappings":"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"} \ No newline at end of file +{"version":3,"file":"hapi-router.cjs.js","sources":["../src/util/index.ts","../src/util/decorators.ts","../src/index.ts"],"sourcesContent":["// @ts-nocheck\n\nconst path = require(\"path\")\nconst fs = require(\"fs\")\n\nexport function removeIndex(ss:any) {\n const remove = (str:any) => {\n if (str.endsWith(\"/index\")) {\n return str.slice(0, -6);\n }\n if (str.endsWith(\"index\")) {\n return str.slice(0, -5);\n }\n return str ? str : \"/\";\n };\n let r = true;\n let rr = ss;\n while (r) {\n if (rr.endsWith(\"/index\")) {\n rr = remove(rr);\n } else {\n r = false;\n }\n }\n return rr ? rr : \"/\";\n}\n\nexport function isIndexEnd(str:any) {\n return str.length == 1 && str.endsWith(\"/\");\n}\n\n\nexport function walkDir(\n filePath:any,\n exclude = [\"node_modules\", \"^_\", \".git\", \".idea\", \".gitignore\", \"client\",\"\\.txt$\"]\n) {\n let files:any[] = [];\n function Data(opts:any) {\n this.relativeDir = opts.relativeDir;\n this.relativeFile = opts.relativeFile;\n this.filename = opts.filename;\n this.file = opts.file;\n this.absoluteFile = opts.absoluteFile;\n this.relativeFileNoExt = opts.relativeFileNoExt;\n this.absoluteDir = opts.absoluteDir;\n }\n function readDir(filePath, dirname = \".\") {\n let res = fs.readdirSync(filePath);\n res.forEach((filename) => {\n const filepath = path.resolve(filePath, filename);\n const stat = fs.statSync(filepath);\n const name = filepath.split(path.sep).slice(-1)[0];\n if (typeof exclude === \"string\" && new RegExp(exclude).test(name)) {\n return;\n }\n if (Array.isArray(exclude)) {\n for (let i = 0; i < exclude.length; i++) {\n const excludeItem = exclude[i];\n if (new RegExp(excludeItem).test(name)) {\n return;\n }\n }\n }\n if (!stat.isFile()) {\n readDir(filepath, dirname + path.sep + name);\n } else {\n const data = new Data({\n relativeDir: dirname,\n relativeFile: dirname + path.sep + path.parse(filepath).base,\n relativeFileNoExt: dirname + path.sep + path.parse(filepath).name,\n file: path.parse(filepath).base,\n filename: path.parse(filepath).name,\n absoluteFile: filepath,\n absoluteDir: path.parse(filepath).dir,\n });\n files.push(data);\n }\n });\n }\n readDir(filePath);\n return files;\n}\n","// @ts-nocheck\n\nexport function method(opts?:string|Array) {\n return function (target, propertyKey: string, descriptor: PropertyDescriptor) {\n target[propertyKey].$method = opts\n }\n}\nexport function route(route?:string) {\n return function (target, propertyKey: string, descriptor: PropertyDescriptor) {\n target[propertyKey].$route = route\n }\n}\n\nexport function config(options:Object) {\n return function (target, propertyKey: string, descriptor: PropertyDescriptor) {\n target[propertyKey].$options = options\n }\n}\n\nexport function auth(isAuth:boolean = true) {\n return function (target, propertyKey: string, descriptor: PropertyDescriptor) {\n target[propertyKey].$auth = isAuth\n }\n}\n\nexport function validate(validate:Object) {\n return function (target, propertyKey: string, descriptor: PropertyDescriptor) {\n target[propertyKey].$validate = validate\n }\n}\n\nexport function swagger(desc,notes,tags) {\n return function (target, propertyKey: string, descriptor: PropertyDescriptor) {\n target[propertyKey].$swagger = [desc,notes,tags]\n }\n}\n","// @ts-nocheck\n\nimport { walkDir, removeIndex, isIndexEnd } from \"./util\";\nimport * as Joi from \"joi\";\nconst path = require(\"path\")\nconst fs = require(\"fs\")\n\nconst routes = [\"所有路由路径:\"];\n\nclass routePlugin {\n public name: string = \"routePlugin\";\n public version: string = \"0.0.1\";\n public register(server: any, options: any) {\n const sourceDir = options.sourceDir;\n\n const files = walkDir(sourceDir);\n files.forEach((file) => {\n let filename = file.relativeFileNoExt;\n let array = filename.split(path.sep).slice(1);\n let fileNoExt = removeIndex(\"/\" + array.join(\"/\"));\n const moduleName = path.resolve(sourceDir, filename);\n const obj = require(moduleName);\n if (obj.default) {\n const func = new (obj.default || obj)();\n const prototype = Object.getPrototypeOf(func);\n const keys = Reflect.ownKeys(prototype);\n for (const key of keys) {\n if (key !== \"constructor\") {\n let ff = func[key];\n // 默认方法\n const method = ff.$method || \"GET\";\n // 路由收集规则\n let route = \"\";\n if (ff.$route) {\n if (isIndexEnd(fileNoExt)) {\n route = ff.$route;\n } else {\n route = fileNoExt + ff.$route;\n }\n } else {\n if (isIndexEnd(fileNoExt)) {\n route = fileNoExt + key.toString();\n } else {\n route = fileNoExt + \"/\" + key.toString();\n }\n }\n route = removeIndex(route);\n // 配置规则\n const options = ff.$options ? ff.$options : {};\n if (!options.auth) {\n if (ff.$auth == undefined) {\n if (route.startsWith(\"/api\")) {\n options.auth = \"jwt\";\n } else {\n options.auth = false;\n }\n } else if (ff.$auth) {\n options.auth = \"jwt\";\n } else {\n options.auth = false;\n }\n }\n if (!options.validate) {\n let validateObj = ff.$validate || {};\n if(options.auth){\n validateObj = Object.assign(validateObj,{\n headers: Joi.object({\n Authorization: Joi.string(),\n }).unknown(), // 注意加上这个\n })\n }\n if (validateObj) {\n options.validate = validateObj;\n }\n }\n if (ff.$swagger && route.startsWith(\"/api\")) {\n options.description = ff.$swagger[0];\n options.notes = ff.$swagger[1];\n options.tags = ff.$swagger[2];\n }\n let str = route;\n if (options.auth) {\n str += \" 该路由需要权限\";\n } else {\n str += \" 该路由不需要权限\";\n }\n routes.push(str);\n server.route({\n method: method,\n path: route,\n handler: ff,\n options: options,\n });\n }\n }\n }\n });\n fs.writeFileSync(path.resolve(sourceDir, \"route.txt\"), routes.join(\"\\n\"), {\n encoding: \"utf-8\",\n });\n }\n}\n\nconst plugin = new routePlugin();\n\nexport { plugin };\nexport * from \"./util/decorators\";\n"],"names":["path","fs","Joi"],"mappings":"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"} \ No newline at end of file diff --git a/packages/hapi-router/package.json b/packages/hapi-router/package.json index 716da4c..51e70db 100755 --- a/packages/hapi-router/package.json +++ b/packages/hapi-router/package.json @@ -34,5 +34,8 @@ "rollup-plugin-typescript2": "^0.27.2", "tslib": "^2.0.1", "typescript": "^3.9.7" + }, + "dependencies": { + "joi": "^17.4.0" } } diff --git a/packages/hapi-router/pnpm-lock.yaml b/packages/hapi-router/pnpm-lock.yaml index 67d731c..4223d5b 100644 --- a/packages/hapi-router/pnpm-lock.yaml +++ b/packages/hapi-router/pnpm-lock.yaml @@ -10,6 +10,7 @@ specifiers: execa: ^4.0.3 fs-extra: ^9.0.1 ftp-deploy: ^2.3.6 + joi: ^17.4.0 lodash: ^4.17.20 rollup: ^2.26.3 rollup-plugin-sourcemaps: ^0.6.2 @@ -17,6 +18,9 @@ specifiers: tslib: ^2.0.1 typescript: ^3.9.7 +dependencies: + joi: 17.4.0 + devDependencies: '@rollup/plugin-alias': 3.1.2_rollup@2.51.2 '@rollup/plugin-commonjs': 15.1.0_rollup@2.51.2 @@ -36,6 +40,16 @@ devDependencies: packages: + /@hapi/hoek/9.2.0: + resolution: {integrity: sha512-sqKVVVOe5ivCaXDWivIJYVSaEgdQK9ul7a4Kity5Iw7u9+wBAPbX1RMSnLLmp7O4Vzj0WOWwMAJsTL00xwaNug==} + dev: false + + /@hapi/topo/5.0.0: + resolution: {integrity: sha512-tFJlT47db0kMqVm3H4nQYgn6Pwg10GTZHb1pwmSiv1K4ks6drQOtfEF5ZnPjkvC+y4/bUPHK+bc87QvLcL+WMw==} + dependencies: + '@hapi/hoek': 9.2.0 + dev: false + /@icetee/ftp/0.3.15: resolution: {integrity: sha512-RxSa9VjcDWgWCYsaLdZItdCnJj7p4LxggaEk+Y3MP0dHKoxez8ioG07DVekVbZZqccsrL+oPB/N9AzVPxj4blg==} engines: {node: '>=0.8.0'} @@ -92,6 +106,20 @@ packages: rollup: 2.51.2 dev: true + /@sideway/address/4.1.2: + resolution: {integrity: sha512-idTz8ibqWFrPU8kMirL0CoPH/A29XOzzAzpyN3zQ4kAWnzmNfFmRaoMNN6VI8ske5M73HZyhIaW4OuSFIdM4oA==} + dependencies: + '@hapi/hoek': 9.2.0 + dev: false + + /@sideway/formula/3.0.0: + resolution: {integrity: sha512-vHe7wZ4NOXVfkoRb8T5otiENVlT7a3IAiw7H5M2+GO+9CDgcVUUsX1zalAztCmwyOr2RUTGJdgB+ZvSVqmdHmg==} + dev: false + + /@sideway/pinpoint/2.0.0: + resolution: {integrity: sha512-RNiOoTPkptFtSVzQevY/yWtZwf/RxyVnPy/OcA9HBM3MlGDnBEYL5B41H0MTn0Uec8Hi+2qUtTfG2WWZBmMejQ==} + dev: false + /@types/detect-indent/0.1.30: resolution: {integrity: sha1-3GgrtBK05lugmOcO2tc7SDP7kQ0=} dev: true @@ -445,6 +473,16 @@ packages: resolution: {integrity: sha1-6PvzdNxVb/iUehDcsFctYz8s+hA=} dev: true + /joi/17.4.0: + resolution: {integrity: sha512-F4WiW2xaV6wc1jxete70Rw4V/VuMd6IN+a5ilZsxG4uYtUXWu2kq9W5P2dz30e7Gmw8RCbY/u/uk+dMPma9tAg==} + dependencies: + '@hapi/hoek': 9.2.0 + '@hapi/topo': 5.0.0 + '@sideway/address': 4.1.2 + '@sideway/formula': 3.0.0 + '@sideway/pinpoint': 2.0.0 + dev: false + /jsonfile/4.0.0: resolution: {integrity: sha1-h3Gq4HmbZAdrdmQPygWPnBDjPss=} optionalDependencies: diff --git a/packages/hapi-router/rollup.config.js b/packages/hapi-router/rollup.config.js index d8cdc39..ebd4d2b 100755 --- a/packages/hapi-router/rollup.config.js +++ b/packages/hapi-router/rollup.config.js @@ -20,6 +20,7 @@ export default createConfig(); function createConfig() { return { input, + external: ['joi'], output: createOutput(buildOptions), plugins: createPlugin(), }; diff --git a/packages/hapi-router/src/index.ts b/packages/hapi-router/src/index.ts index 05e7cb3..b0ab658 100755 --- a/packages/hapi-router/src/index.ts +++ b/packages/hapi-router/src/index.ts @@ -1,6 +1,7 @@ // @ts-nocheck import { walkDir, removeIndex, isIndexEnd } from "./util"; +import * as Joi from "joi"; const path = require("path") const fs = require("fs") @@ -60,8 +61,16 @@ class routePlugin { } } if (!options.validate) { - if (ff.$validate) { - options.validate = ff.$validate; + let validateObj = ff.$validate || {}; + if(options.auth){ + validateObj = Object.assign(validateObj,{ + headers: Joi.object({ + Authorization: Joi.string(), + }).unknown(), // 注意加上这个 + }) + } + if (validateObj) { + options.validate = validateObj; } } if (ff.$swagger && route.startsWith("/api")) { diff --git a/source/route/index/index.ts b/source/route/index/index.ts index 91e46e5..3f0a0ab 100644 --- a/source/route/index/index.ts +++ b/source/route/index/index.ts @@ -1,4 +1,4 @@ -import { config, method } from "@noderun/hapi-router"; +import { config, method, route } from "@noderun/hapi-router"; import UploadFunc from "./_upload"; export default class { @@ -14,7 +14,6 @@ export default class { allow: "multipart/form-data", }, }) - @method("POST") async upload(req, h) { const startTime = new Date().getTime(); @@ -25,4 +24,10 @@ export default class { ); return res; } + + @route("/{path*}") + async 404(req, h) { + // 404页面 + return h.view("404.ejs"); + } } diff --git a/source/route/route.txt b/source/route/route.txt index 9296460..c0b60fa 100644 --- a/source/route/route.txt +++ b/source/route/route.txt @@ -4,5 +4,6 @@ /api/user/login 该路由不需要权限 /api/user/del 该路由需要权限 /api/user/userinfo 该路由需要权限 +/{path*} 该路由不需要权限 / 该路由不需要权限 /upload 该路由不需要权限 \ No newline at end of file diff --git a/source/run.ts b/source/run.ts index d9f28d6..f828f20 100644 --- a/source/run.ts +++ b/source/run.ts @@ -3,7 +3,8 @@ import plugins from "@/plugins"; import { baseDir } from "@/util"; import validate from "./validate"; const Hapi = require("@hapi/hapi"); -const HapiSwagger = require("hapi-swagger"); +// const HapiSwagger = require("hapi-swagger"); +// const HapiSwagger = require("hapi-swaggered-ui"); // swagger v2版本 const run = async () => { const server = Hapi.server({ @@ -11,20 +12,6 @@ const run = async () => { host: "localhost", }); - // http://localhost:3000/documentation - const swaggerOptions = { - info: { - title: "Dream 文档", - version: "1.0.0", - }, - }; - await server.register([ - { - plugin: HapiSwagger, - options: swaggerOptions, - }, - ]); - /** * jwt */ @@ -58,6 +45,20 @@ const run = async () => { path: "template", }); + // http://localhost:3000/documentation + await server.register([ + { + plugin: require("hapi-swagger"), + options: { + documentationPath: "/doc", + info: { + title: "Dream 文档", + version: "1.0.0", + }, + }, + }, + ]); + await server.start(); console.log("Server running on %s", server.info.uri); }; diff --git a/template/404.ejs b/template/404.ejs new file mode 100644 index 0000000..f1b1cb3 --- /dev/null +++ b/template/404.ejs @@ -0,0 +1 @@ +404