【问题标题】:TSOA Express App return cannot get endpointsTSOA Express App 返回无法获取端点
【发布时间】:2019-08-09 21:30:15
【问题描述】:

我正在 node.js 和 Typescript 中构建一个 REST API,我正在使用 tsoa 和大摇大摆的文档。构建成功,swagger.json 生成成功但没有找到端点。

src/app.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 }

src/routes/user.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,我无法理解为什么,不胜感激。

提前致谢

【问题讨论】:

    标签: node.js typescript swagger decorator


    【解决方案1】:

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

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

    【讨论】:

    • 你做的没错!我发表评论时没有看用户名,哈哈。再次感谢您对 tsoa 的贡献。另外,我很高兴您正在审查堆栈溢出,因为我没有按应有的时间观看它。如果我能弄清楚怎么做,我会尝试在这里制作一个 tsoa 标签。
    • 听起来很棒,总是乐于助人!你知道新版 tsoa 什么时候发布到 npm 上吗?
    • 本周早些时候我发布了那个版本和几个后续版本。我已经在使用您的出色功能了。我们还为其他属性添加了严格的评估。
    【解决方案2】:

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

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

    (请注意,您仍然需要包含其他配置选项——为简洁起见,我刚刚删除了它们)

    在此处阅读更多信息:https://github.com/lukeautry/tsoa#consuming-generated-routes

    【讨论】:

      【解决方案3】:

      我在使用 TSOA 时遇到了同样的问题,当从 ts-node 运行时,它工作正常,但是在 tsc build swagger docs 引发 cannot Get 错误之后。

      问题是 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 }
      

      【讨论】:

        猜你喜欢
        • 2022-12-01
        • 1970-01-01
        • 2018-12-26
        • 2019-12-16
        • 2020-12-17
        • 2014-09-10
        • 2018-06-17
        • 1970-01-01
        • 2016-10-13
        相关资源
        最近更新 更多