Next.js constantly rebuilds your API routes in development mode, triggering each time the creation of new instances of databases and other third-party services your back-end relies on.
This is not a very well documented part, and I've spent many hours looking for a solution, both online and within the source code of Next.js, to finally find a very simple yet elegant one: using global
.
Indeed the server itself does not reload, so global
is preserved across incremental builds. So here's the helper I use to prevent the server from stacking Redis, PostgreSQL and other SDK clients:
/**
* Register service.
* @description Stores instances in `global` to prevent memory leaks in development.
* @arg {string} name Service name.
* @arg {function} initFn Function returning the service instance.
* @return {*} Service instance.
*/
const registerService = (name, initFn) => {
if (process.env.NODE_ENV === 'development') {
if (!(name in global)) {
global[name] = initFn();
}
return global[name];
}
return initFn();
};
Yep, that's it. To use it, simply call:
import knex from 'knex';
export const db = registerService('db', () => knex({
client: 'pg',
connection: process.env.DATABASE_URL,
}));
Now you won't have to restart Next.js server every 10 minutes to flush out residual clients.
Top comments (4)
Thank you very much ! That saved me a lot of hours!
Thank you!!!! This had been bothering me for weeks, and just now I also just spent hours trying to find any explanation for why Next.js (at least in dev mode) seems to be compiling and restarting on every single http request, even without any changes between requests. Finally, a solution! This really needs to be documented somewhere. Who knows how much time you just saved me. Muchas gracias!
I'm glad it helped! Had a lot of trouble myself to find a solution.
If you have found this and am working with Typescript, just keep registerService.js in JS and it will work, trust.