启动开发服务器后进入组件时onMount请求失败,刷新后恢复正常
问题原因及修复方案
核心问题
你的connectToDatabase函数返回值存在不一致性,这是导致首次请求500错误、后续请求正常的根本原因。
详细解释
首次调用逻辑:
启动服务器后第一次调用connectToDatabase时,cached.conn不存在,函数会执行await cached.promise,最终返回cached.conn.db(即MongoDB的数据库实例)。
此时在接口代码中:const dbConnection = await connectToDatabase(); const db = dbConnection.db;dbConnection已经是数据库实例,再访问它的db属性会得到undefined,调用db.collection()时自然抛出错误,返回500状态码。后续调用逻辑:
第一次请求完成后,cached.conn已被缓存,再次调用connectToDatabase时会直接返回cached.conn(一个包含client和db属性的对象)。此时dbConnection.db能正确获取到数据库实例,后续查询操作正常执行。
修复方案
你需要让connectToDatabase函数始终返回一致的结果,以下两种方案任选其一:
方案一:始终返回数据库实例
修改lib/mongodb/db.ts中的函数:
export async function connectToDatabase() { // 直接返回缓存的db实例 if (cached.conn) return cached.conn.db; if (!cached.promise) { const conn: any = {}; const opts = { useNewUrlParser: true, useUnifiedTopology: true }; cached.promise = MongoClient.connect(MONGODB_URI, opts) .then((client: any) => { conn.client = client; return client.db(MONGODB_DB); }) .then((db) => { conn.db = db; cached.conn = conn; }); } await cached.promise; return cached.conn.db; }
同时简化接口代码(src/routes/Cities/index.ts):
export async function get() { try { const db = await connectToDatabase(); // 直接拿到db实例 const collection = db.collection('Cities'); const query = await collection.find({}).toArray(); return { status: 200, body: { query } }; } catch (err: any) { return { status: 500, body: { error: err.message } }; } }
方案二:始终返回包含client和db的连接对象
修改lib/mongodb/db.ts中的函数:
export async function connectToDatabase() { if (cached.conn) return cached.conn; if (!cached.promise) { const conn: any = {}; const opts = { useNewUrlParser: true, useUnifiedTopology: true }; cached.promise = MongoClient.connect(MONGODB_URI, opts) .then((client: any) => { conn.client = client; return client.db(MONGODB_DB); }) .then((db) => { conn.db = db; cached.conn = conn; return conn; // 让promise最终返回conn对象 }); } return cached.promise; // 直接返回promise,await后得到conn }
接口代码可以保持原样,或者简化为:
const { db } = await connectToDatabase(); const collection = db.collection('Cities');
额外建议
你当前使用的SvelteKit@0.0.1是非常早期的测试版本,存在大量未修复的bug和兼容性问题,建议尽快升级到最新稳定版,避免其他潜在问题。
内容的提问来源于stack exchange,提问作者Krystioz
相关产品推荐
相关产品推荐

