- Copy
.env.example, and rename to.env - Configure newly copied
.envfile
This project was setup using Node.js v18.5.
- Install dependencies with
npm install - Start developoment server with
npm run dev
Production build is compiled first into JavaScript, built on the ./dist folder, and can be ran after compilation.
- Run
npm run build - Run
npm run start
Every development files are located within the ./src folder.
├── app.ts
├── config
│ └── db.ts
├── controllers
│ └── user-controller.ts
├── middleware
│ ├── async-middleware.ts
│ ├── auth-middleware.ts
│ └── error-middleware.ts
├── routes
│ └── user-route.ts
├── __tests__
│ └── example.test.ts
├── types
│ ├── enums
│ │ └── enums.common.ts
│ ├── interfaces
│ │ └── interfaces.common.ts
│ └── types
│ │ └── types.common.ts
│ └── index.d.ts
└── utils
├── ApiError.ts
└── ApiSucess.ts
Passing middleware into the asyncHandler will allow the server to automatically catch any internal server errors, or manually thrown errors from the server.
// ? asyncHandler should be used for every request for easy async handling
export const getUsers = asyncHandler(
async (req: Request, res: Response, next: NextFunction) => {
// Example user, get from database
const user = [{ name: "John Doe" }, { name: "Jaen Doe" }];
// Return json with success message
res.status(200).json(new ApiSuccess<User[]>(user, "Success!"));
},
);Using ApiError or ApiSuccess allows for consistent responses across all routes; please use this instead of passing your own data structure.
throw new ApiError({}, 500, "Handled by asyncHandler"); res.status(200).json(new ApiSuccess<User[]>(user, "Success!"));If you add extra folders to this template and would like to use them with aliases, then go through following:
- Go into
tsconfig.json - Add extra paths inside of
{ paths: ... }(for tsconfig-paths) - Go into
package.json - Add extra paths inside of
{_moduleAliases: ... }(for production build)