# Working with Express.js If using express, hot server hot module reloading may not work after [these steps](/practice/frameworks/next/index.md#step-3-implementing-ssr) Express has its own route stack, so reloading require cache will not be enough to reload the routes inside express.
### Add global callback in express For hot module reloading with Express and Next.js, setting up a global callback to clear the Express route cache is required. This allows route updates to be recognized without server restarts. ```javascript title="server/express.js" import express from 'express'; import next from 'next'; const dev = process.env.NODE_ENV !== 'production'; const hostname = 'localhost'; const port = 3000; const app = next({ dev, hostname, port }); const handle = app.getRequestHandler(); global.clearRoutes = () => { server._router.stack = server._router.stack.filter((k) => !(k && k.route && k.route.path)); }; app.prepare().then(() => { const server = express(); server.all('*', (req, res) => { const parsedUrl = new URL(req.url, `http://${req.headers.host}`); const { pathname, query } = parsedUrl; handle(req, res, parsedUrl); }); server.listen(port, () => { console.log(`> Ready on http://${hostname}:${port}`); }); }); ``` ### Trigger callback in revalidation add a global callback in `_document.js` to clear the Express route cache during revalidation, allowing updated routes to be served without server restarts. ```jsx title="pages/_document.js" class MyDocument extends Document { static async getInitialProps(ctx) { if (ctx?.pathname && !ctx?.pathname?.endsWith('_error')) { await revalidate().then((shouldUpdate) => { if (shouldUpdate) { global.clearRoutes(); } }); } const initialProps = await Document.getInitialProps(ctx); return initialProps; } render() { return ( <Html> <Head /> <body> <Main /> <NextScript /> </body> </Html> ); } } ```