- Copy
.env.example
, and rename to.env
- Configure newly copied
.env
file
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)