You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

启动开发服务器后进入组件时onMount请求失败,刷新后恢复正常

问题原因及修复方案

核心问题

你的connectToDatabase函数返回值存在不一致性,这是导致首次请求500错误、后续请求正常的根本原因。

详细解释

  1. 首次调用逻辑:
    启动服务器后第一次调用connectToDatabase时,cached.conn不存在,函数会执行await cached.promise,最终返回cached.conn.db(即MongoDB的数据库实例)。
    此时在接口代码中:

    const dbConnection = await connectToDatabase();
    const db = dbConnection.db;
    

    dbConnection已经是数据库实例,再访问它的db属性会得到undefined,调用db.collection()时自然抛出错误,返回500状态码。

  2. 后续调用逻辑:
    第一次请求完成后,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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.24 04:36:22