SvelteKit集成MongoDB出现ReferenceError: global is not defined错误如何解决
错误原因
mongodb是专为Node.js服务端环境设计的依赖包,其内部代码依赖Node.js专属全局变量global。而SvelteKit默认会对所有导入的依赖做同构构建,也就是同时打包服务端和客户端两份代码,浏览器客户端环境不存在global变量,因此只要该工具文件被客户端代码引用,就会触发你遇到的报错,和服务端逻辑本身无关。
解决办法
- 第一步:修改数据库工具文件的命名,将
database.js重命名为database.server.js,SvelteKit约定带.server.js后缀的文件仅会被打包到服务端,不会输出到客户端代码中,从根源上避免客户端加载mongodb相关代码。 - 第二步:修正代码中的变量错误,原代码中存在两处变量未定义的问题,会导致后续运行报错,修正后的核心代码如下:
// src/lib/database.server.js import { ENV_OBJ } from "$lib/env"; import { MongoClient } from "mongodb"; const uri = ENV_OBJ.MONGODB_URI; const dbName = ENV_OBJ.MONGODB_DB; if (!uri) { throw new Error("Please define the Mongodb uri environment variable inside .env"); } if (!dbName) { throw new Error("Please define the Mongodb db name environment variable inside .env"); } /** * Global is used here to maintain a cached connection across hot reloads * in development. This prevents connections growing exponentially * during API Route usage. */ let cached = globalThis.mongo if (!cached) { cached = globalThis.mongo = { conn: null, promise: null } } export const connectToDatabase = async() => { if (cached.conn) { return cached.conn; } if (!cached.promise) { const options = { useNewUrlParser: true, useUnifiedTopology: true }; cached.promise = MongoClient.connect(uri, options).then((client) => { return { client, db: client.db(dbName), } }) } cached.conn = await cached.promise; return cached.conn; }
- 第三步:确保仅在服务端逻辑中导入该工具,比如仅在API路由、
+page.server.js/+layout.server.js这类服务端专属文件中调用connectToDatabase,不要在普通.svelte组件、客户端js文件中导入该工具。
关于global.d.ts的说明
该文件是TypeScript全局类型声明文件,其中的代码仅用于给编辑器、TS类型检查器提供SvelteKit的全局类型提示,和本次运行时报错无关,无需修改。
内容的提问来源于stack exchange,提问作者zipzit
相关产品推荐
相关产品推荐

