swagger TSOA Express应用程序返回无法获取端点

4ioopgfo  于 2022-11-06  发布在  其他
关注(0)|答案(4)|浏览(203)

我正在node.js和Typescript中构建REST API。我正在使用tsoa和swagger进行文档编制。构建成功,并且成功生成了swagger.json,但未找到端点。
来源/应用程序.ts

import * as express from "express"
import * as bodyparser from "body-parser"
import { RegisterRoutes } from "./routes/routes"
import * as swaggerUi from "swagger-ui-express"
import * as methodOverride from "method-override"

/**import all your routes here */
import "./routes/user"

/**End of Routes */
const app = express()

try {
  const swaggerDocument = require("../swagger.json")
  app.use("/docs", swaggerUi.serve, swaggerUi.setup(swaggerDocument))
} catch (err) {
  console.error("Unable to read swagger.json", err)
}
app.use(bodyparser.json())
app.use(methodOverride())
RegisterRoutes(app)

export { app }

源代码/路由/用户.ts

import {Get,Post,Route,Body,Query,Header,Path,SuccessResponse,Controller as Router } from "tsoa"
import { User, UserCreationRequest } from "../components/user"
import { UserController } from "../controllers/user"
@Route("users")
export class UsersRouter extends Router {
  @Get("/{id}")
  public async getUser(@Path("id") id: number): Promise<User> {
    return new UserController().getUser(id)
  }

  @SuccessResponse("201", "Created") // Custom success response
  @Post()
  public async createUser(
    @Body() requestBody: UserCreationRequest
  ): Promise<void> {
    this.setStatus(201) // set return status 201
    return Promise.resolve()
  }
}

当我打开/docs时,它返回了带有预期端点的swagger UI,但当我尝试使用/users/{id}等API时,它返回了404,我无法理解为什么,请提供帮助。

提前感谢

sshcrbum

sshcrbum1#

另一个答案是正确的,但是在verson 2.4.5中有一个更新和更简单的选项(所以你可能需要升级tsoa来利用它)。如果你把controllerPathGlobs添加到tsoa.json中,它会找到任何有@Route装饰器的类。所以对你来说,你会需要下面的glob:

{
    "routes": {
        "controllerPathGlobs": [
            "./src/routes/**/*.ts"
        ]
    }
}

(note您仍然希望包括其他配置选项--为了简洁起见,我删除了它们)
点击此处阅读更多信息:https://github.com/lukeautry/tsoa#consuming-generated-routes

liwlm1x9

liwlm1x92#

我在使用TSOA时遇到了同样的问题,当从ts-node运行时,它工作得很好,但是在tsc构建swagger docs后,抛出了一个无法获取的错误。
问题是swagger.json是如何导入的,从require切换到import后,它工作了!

import * as express from "express"
import * as bodyparser from "body-parser"
import { RegisterRoutes } from "./routes/routes"
import * as swaggerUi from "swagger-ui-express"
import * as methodOverride from "method-override"

//try this 
import swaggerDocument from "../swagger.json"
/**import all your routes here */
import "./routes/user"

/**End of Routes */
const app = express()

try {

  app.use("/docs", swaggerUi.serve, swaggerUi.setup(swaggerDocument))
} catch (err) {
  console.error("Unable to read swagger.json", err)
}
app.use(bodyparser.json())
app.use(methodOverride())
RegisterRoutes(app)

export { app }
pqwbnv8z

pqwbnv8z3#

您应该在app中导入所有路由器的启动文件参见:https://github.com/lukeautry/tsoa/#consuming-generated-routes

// controllers need to be referenced in order to get crawled by the generator
import './controllers/usersController';
uhry853o

uhry853o4#

在我个人的情况下,它是一个丢失的导入文件。大写字母。

相关问题