How to use tsoa with express

1k Views Asked by At

In express.js I have controller defined like this:

@Route('notes')
export default class NoteController extends Controller {
    @Get('/')
    public async (req: Request, res: Response, _next: NextFunction): Promise<any> => {
        try {
            const Note: CreateNote = req.body;
            await notesQueries.createNote(Note);
            return res.status(200).send({
                data: {},
                code: 200,
                message: 'Note created!'
            });
        } catch (e) {
            console.log(e);
            return res.status(400).send({
                data: {},
                code: 400,
                message: 'Something happened on creating Note!'
            });
        }
    };

When I run tsoa spec to generate swagger.json I got following error message:

There was a problem resolving type of 'Request'.
Generate swagger error.
GenerateMetadataError: Cannot read properties of undefined (reading 'text')

Trying to figure what am I doing wrong? Anyone have idea?

1

There are 1 best solutions below

0
On

I faced same problem, fixed using tsoa documentation, they recomend to generate routes in dist folder for example and use RegisterRoutes on app, tsoa will register all controllers with Route() decorator over.

// tsoa.json
{
  "entryFile": "src/app.ts",
  "noImplicitAdditionalProperties": "throw-on-extras",
  "controllerPathGlobs": ["src/**/*Controller.ts"],
  "spec": {
    "outputDirectory": "build",
    "specVersion": 3
  },
  "routes": {
    "routesDir": "build"
  }
}

and in app:

// src/app.ts
import express, {json, urlencoded} from "express";
import { RegisterRoutes } from "../build/routes";

export const app = express();

// Use body parser to read sent json payloads
app.use(
  urlencoded({
    extended: true,
  })
);
app.use(json());

RegisterRoutes(app);