TSOA — Setup Environment
To setup node express environment, we would need the following dependencies as listed below,
- Node JS
- Express JS
- TSOA
- Mongoose ( ORM )
Keep in mind , that we would need respective typings also for the list mentioned above.
Basic Configuration
Here we go,
Install tsc & typescript globally, which helps in compiling your codebase from typescript to javascript. To do that, run the following commands,
npm i -g tsc@latest
npm i -g typescript@latest
you are done :)
Create a Node JS project , using below
npm init
Mention title for your project and proceed further. You will end up with package.json file created, has all the info about your app.
Mention your dependencies respectively like mentioned below,
“dependencies”: {
“express”: “4.15.3”,
“mongodb”: “².2.28”,
“mongoose”: “⁴.10.5”,
“tsoa”: “¹.1.8”
}
“devDependencies”: {
“@types/express”: “⁴.0.30”,
“@types/mongodb”: “².2.4”,
“@types/mongoose”: “⁴.7.17”,
“@types/node”: “7.0.22”
}
Lets Deep dive
Create controllers directory in your project root folder and create the file as below,
//controllers/todocontroller.tsimport {Get, Post, Route, Body, Query, Header, Path, SuccessResponse, Controller } from 'tsoa';
import {TodoService} from '../services/todoService';
import {Todo} from '../models/todo';
@Route('todo')
export class TodoController extends Controller {
@Get('/get')
public async getTodos(): Promise<Todo> {
return await new TodoService().fetchAll();
}
}
Create Model
//models/todo.tsexport interface Todo {
id: number;
todo: string;
}
Creating Middleware
Create directory named middleware and create file as below,
//middleware/todoroute.tsimport { TodoController } from '../controllers/todocontroller';export class TodoRoute { constructor(private _app: any) {this._app.get('/todo/get', function(req, res, next) => {
const controller = new TodoController(); const promise = controller.activate.apply(controller, [req.body]); this.promiseHandler(controller, promise, response, next); }); }private promiseHandler(controllerObj: any, promise: any, response: any, next: any) {return Promise.resolve(promise) .then((data: any) => { let statusCode; if (controllerObj instanceof Controller) { const controller = controllerObj as Controller const headers = controller.getHeaders(); Object.keys(headers).forEach((name: string) => { response.set(name, headers[name]); }); statusCode = controller.getStatus(); } if (data) { response.status(statusCode || 200).json(data); } else { response.status(statusCode || 204).end(); } }).catch((error: any) => next(error)); }
}
Almost Done
Completed the coding stuff from above,
now we can start conversion of our API into swagger spec,
Create a config file called tsoa.json in your root folder,
{ "swagger": { "info": { "description": "", "version": "1.0.0", "title": "Tsoa Rest Apis" }, "schemes": [ "http", "https" ] }, "outputDirectory": "./dist", "entryFile": "./src/app.ts", "host": "localhost:8080", "basePath": "/"}, "routes": { "basePath": "/api", "entryFile": "./src/app.ts", "routesDir": "./src/middleware" }}
Create npm scripts as follows,
tsoa routes
tsoa swagger
Everything fine :) , Run your commands to see the generated swagger.json file in your root folder for the API what you have created Using @Route
Enjoy coding !!