A lightweight and flexible file-based routing system for Express.js, Hono, Diesel, or any other framework.
- Simple and easy-to-use routing system
- Automatic route loading from a directory
- Works seamlessly with Express.js, Hono, Diesel
- Supports defining multiple HTTP methods in a single route file
Note: Fastify requires a workaround using
setTimeout
(100-200ms) to prevent errors.
- Wrap loadRoutes func under setTimeout and give time from 100ms or more until it works.
- Or you can use
fastify-autoload
which is native fastify library
bun install ex-router
npm install ex-router
Import loadRoutes
and initialize it with your app:
import express from 'express';
import { loadRoutes } from 'ex-router';
const app = express();
const port = 3000;
// Load routes
loadRoutes(app, {
routeDir: process.cwd() + '/src/routes',
prefixUrl: ''
});
app.get('/', (_, res) => {
res.send('Hello, world!');
});
app.listen(port, () => {
console.log(`Server is running on port ${port}`);
});
Note: Ensure your server file is in the root directory and
routes
folder is undersrc/
.
example/
├── src/
│ ├── controller/
│ ├── routes/
│ │ ├── auth/
│ │ │ ├── login.ts
│ │ │ ├── register.js
│ │ ├── user/
│ │ │ ├── profile/
│ │ │ │ ├── index.ts
│ │ │ │ ├── delete.ts
│ │ │ │ ├── videos.ts
│ ├── utils/
│ ├── server.ts // root
-
app
- The application instance. -
options.routeDir
- The directory containing route files. -
options.prefixUrl
(optional) - A prefix for all routes.
File Path | API Route
------------------------------------|-----------
src/routes/hello.ts | /hello
src/routes/auth/login.ts | /auth/login
src/routes/user/profile/index.ts | /user/profile
src/routes/user/profile/videos.ts | /user/profile/videos
loadRoutes(app, {
routeDir: process.cwd() + '/src/routes',
prefixUrl: '/api/v1'
});
File Path | API Route
------------------------------------|-----------
src/routes/hello.ts | /api/v1/hello
src/routes/auth/login.ts | /api/v1/auth/login
src/routes/user/index.ts | /api/v1/user
src/routes/videos/api.ts | /api/v1/videos
src/routes/user/videos.ts | /api/v1/user/videos
-
Folders act as route segments
- Example:
routes/user/profile.ts
→/user/profile
- Example:
-
index.ts
orapi.ts
acts as the root- Example:
routes/user/index.ts
→/user
- Example:
routes/user/api.ts
→/user
- Example:
routes/user/profile/index.ts
→/user/profile
- Example:
routes/user/profile/api.ts
→/user/profile
- Example:
-
Multiple HTTP Methods in a Single File
- Users can define multiple HTTP methods (
GET
,POST
,PUT
,DELETE
, etc.) within the same route file.
- Users can define multiple HTTP methods (
- src/routes/login.ts
export const GET = (req, res) => {
return res.send("Hello from login GET request.");
};
export const POST = (req, res) => {
const { username, password } = req.body;
if (!username || !password) {
return res.status(400).send("Username and password are required");
}
return res.send("Login successful");
};
This project is built with modern JavaScript standards. Use ES Modules (import
statements) for better compatibility and maintainability.
Contributions are welcome! Feel free to submit issues or pull requests.
This project is licensed under the MIT License.