Router
Router facade is the backbone of http server to connect different routes to your controllers.
import { Request, Response } from "@devbro/pashmak/router";
import { router } from "@devbro/pashmak/facades";
import { CatController } from "./app/controllers/CatController";
import { AnimalController } from "./app/controllers/AnimalController";
import { loggerMiddleware, logResponseMiddleware } from "./middlewares";
router.addGlobalMiddleware(loggerMiddleware);
router().addRoute(
["GET", "HEAD"],
"/api/v1/countries",
async (req: any, res: any) => {
return { yey: "GET countries" };
},
);
router.addRoute("GET", "/api/v1/countries", async (req: any, res: any) => {
return { yey: "GET countries" };
});
router
.addRoute(["GET", "HEAD"], "/api/v1/regions", async (req: any, res: any) => {
return { yey: "GET regions" };
})
.addMiddleware(logResponseMiddleware);
router.addController(CatController);
router.addController(AnimalController);
router manages both middlewares and controlers.
controller can be either a Controller class or an async function that gets a request and response object.
functional controller
basic format of a functional controller is:
async (req: Request, res: Response) => {
return { message: "GET regions" };
};
if you want to do more complex returns you can directly modify Response.
[!CAUTION] Response and Request objects are NOT the standard objects defined as part of node, make sure to import them from @pashmak.
import { Request, Response } from "@devbro/pashmak/router";
async (req: Request, res: Response) => {
res.writeHead(418, { "Content-Type": "text/plain" });
res.end("Can you guess what I am?");
};
Error handling
Router is able to handle error by default. If you throw any error of type HttpError
, httpserver can render them as json right away. If error is of any other type, server will return a generic 500 error.
import { Request, Response } from "@devbro/pashmak/router";
import { HttpError, HTTPUnauthorizedError } from "@devbro/pashmak/http";
async (req: Request, res: Response) => {
throw new HTTPUnauthorizedError();
};
if you want to have your own custom error handler you can:
import { server } from '@devbro/pashmak/facades';
server().setErrorHandler(async (err: Error, req: any, res: any) => {
// ???
}