# 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>
);
}
}
```