Flexible system-based file routing for Express with 0
dependencies.
npm install express-file-routing
Note: If you prefer yarn
instead of npm
, just use yarn add express-file-routing
.
- app.ts (main)
import express from "express"
import createRouter, { router } from "express-file-routing"
const app = express()
app.use("/", router()) // as router middleware or
createRouter(app) // as wrapper function
app.listen(2000)
Note: It uses your project's /routes
directory as source by default.
- routes/index.ts
export default async (req, res) => {
if (req.method !== "GET") return res.status(404)
return res.status(200)
}
Files inside your project's /routes
directory will get matched an url path automatically.
├── app.ts
├── routes
├── index.ts // index routes
├── posts
├── index.ts
└── :id.ts or [id].ts // dynamic params
└── users.ts
└── package.json
/routes/index.ts
→ //routes/posts/index.ts
→ /posts/routes/posts/[id].ts
→ /posts/:id/routes/users.ts
→ /users
createRouter(app, {
directory: path.join(__dirname, "routes"),
additionalMethods: ["ws", ...]
})
// or
app.use("/", router({
directory: path.join(__dirname, "routes"),
additionalMethods: ["ws", ...]
}))
directory
: The path to the routes directory (defaults to/routes
)additionalMethods
: Additional methods that match an export from a route likews
(e.g.ws
for express-ws)
If you export functions named e.g. get
, post
, put
, patch
, delete
/del
etc. those will get matched their corresponding http method automatically.
export const get = async (req, res) => { ... }
export const post = async (req, res) => { ... }
// it's not allowed to name variables 'delete': try 'del' instead
export const del = async (req, res) => { ... }
// you can still use a wildcard default export in addition
export default async (req, res) => { ... }
Note: Named method exports gain priority over wildcard exports (= default exports).
You can add isolated, route specific middlewares by exporting an array of Express request handlers from your route file.
import { rateLimit, bearerToken, userAuth } from "../middlewares"
export const get = [
rateLimit(), bearerToken(), userAuth(),
async (req, res) => { ... }
]
You can add support for other method exports to your route files.
// app.ts
import ws from "express-ws"
const { app } = ws(express())
createRouter(app, {
additionalMethods: ["ws"]
})
// routes/index.ts
export const ws = async (ws, req) => {
ws.send("msg")
}