TSOA — Setup Environment

Manojkumar Mathiarasan
tsoa-express
Published in
2 min readJun 13, 2018

To setup node express environment, we would need the following dependencies as listed below,

  1. Node JS
  2. Express JS
  3. TSOA
  4. 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 !!

--

--