【发布时间】:2020-11-22 07:28:24
【问题描述】:
我正在开发一个新网站,虽然我们在本地开发时一切正常,但当我们尝试在 Vercel 上部署时遇到了问题。该应用程序对页面和 API 使用 Sapper 框架,以及我们通过 Mongoose 访问的 MongoDB Atlas 中的数据库。我们在本地的行为是我们npm run dev 并建立了一个单独的数据库连接,该连接一直持续到我们关闭应用程序为止。
当它被部署到 Vercel 时,建立数据库连接并打印“数据库连接成功”消息并且只应该运行一次的代码改为在每个 API 请求上运行
这似乎很快就失控了,达到了我们数据库的 500 个连接的限制:
因此,在网站被单个用户短暂使用后,我们的一些 API 请求开始失败并出现此错误(我们让数据库接受任何连接而不是 IP 白名单,因此错误给出的建议是'很有帮助):
我们的实现是在 .js 文件中调用mongoose.connect:
mongoose.connect(DB, {
useNewUrlParser: true,
useCreateIndex: true,
useFindAndModify: false,
useUnifiedTopology: true
}).then(() => console.log("DB connection successful!")).catch(console.error);
然后我们 import Sapper 的 server.js 中的那个文件。我们能够找到的建议是“只缓存连接”,但这并没有成功,而且似乎更像是node-mongodb-native 的事情。无论如何,这是我们尝试过的,但在本地没有更好或更差,但也没有解决 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);}
那么...有没有办法在不更换至少一个部件的情况下完成这项工作?该网站尚未上线,因此更换某些东西并不是世界末日,但“只需更改设置”绝对比从头开始更可取。
【问题讨论】:
-
你在问太多移动的东西。如果您的框架不为您管理数据库连接,则它与为每个请求建立的连接无关。
-
否则链接到您的框架中讨论数据库连接的文档。
-
我认为这很好 - 感谢您发布它。
-
我喜欢了解问题的背景,作为奖励,我了解了 Sapper。
标签: mongodb mongoose mongodb-atlas vercel sapper