Quantcast
Channel: Active questions tagged mongodb-atlas - Stack Overflow
Viewing all articles
Browse latest Browse all 271

Vercel creates new DB connection for every request

$
0
0

I'm working on a new website, and although things were working well as we developed locally we've run into an issue when we tried to deploy on Vercel. The app uses the Sapper framework for both the pages and an API, and a database in MongoDB Atlas that we access through Mongoose. The behavior we have locally is that we npm run dev and a single DB connection is made which persists until we shut the app down.

Local logs

When it gets deployed to Vercel though, the code which makes the DB connection and prints that "DB connection successful" message and is only supposed to run once is instead run on every API request

New DB connection per request

This seems to quickly get out of hand, reaching our database's limit of 500 connections:DB connections hits limit

As a result, after the website is used briefly even by a single user some of our API requests start failing with this error (We have the db accepting any connection rather than an IP whitelist, so the suggestion the error gives isn't helpful):API can't connect to DB

Our implementation is that we have a call to mongoose.connect in a .js file:

mongoose.connect(DB, {    useNewUrlParser: true,    useCreateIndex: true,    useFindAndModify: false,    useUnifiedTopology: true}).then(() => console.log("DB connection successful!")).catch(console.error);

and then we import that file in Sapper's server.js. The recommendation we've been able to find is "just cache the connection", but that hasn't been successful and seems to be more of a node-mongodb-native thing. Regardless, this is what we tried which didn't work better or worse locally, but also didn't fix the problems on Vercel:

let cachedDb = {};exports.connection = async () => {    if (cachedDb.isConnected)        return;        try {            const db = await mongoose.connect(DB, {                            useNewUrlParser: true,                            useCreateIndex: true,                            useFindAndModify: false,                            useUnifiedTopology: true                        });            cachedDb.isConnected = db.connections[0].readyState;            console.log("DB connection successful!");            return cachedDb;        } catch(error) {console.log("Couldn't connect to DB", error);}

So... is there a way to make this work without replacing at least one of the pieces? The website isn't live yet so replacing something isn't the end of the world, but "just change a setting" is definitely preferred to starting from scratch.


Viewing all articles
Browse latest Browse all 271

Trending Articles



<script src="https://jsc.adskeeper.com/r/s/rssing.com.1596347.js" async> </script>