Discord机器人MongoDB经济系统报错:cash/bank属性不存在及弃用警告
问题解决指南
一、TypeScript类型错误:cash/bank 属性不存在
原因
定义Mongoose模型时,错误将typeof UserSchema作为泛型参数传入model(),导致TypeScript无法正确推断文档属性类型,因此识别不了cash和bank字段。
解决步骤
- 定义用户文档接口:在
User.ts中创建对应Schema结构的TypeScript接口,明确各属性类型。 - 修正模型泛型参数:将模型的泛型参数改为自定义接口,而非Schema的类型。
修改后的User.ts代码:
import { Schema, model, Document } from "mongoose"; // 定义用户文档的TypeScript接口 interface IUser extends Document { userId: string; guildId: string; cash: number; bank: number; _id?: string; } const UserSchema = new Schema<IUser>({ userId: { type: Schema.Types.String, required: true }, guildId: { type: Schema.Types.String, required: true }, cash: { type: Number, default: 100 }, bank: { type: Number, default: 0 }, }); // 泛型参数传入IUser,而非typeof UserSchema export default model<IUser>("User", UserSchema, "users");
- 修正
getUserProfile返回类型:确保该函数返回Promise<IUser>类型,让TypeScript正确识别返回对象的属性。示例如下:
import User from "../models/User"; import { IUser } from "../models/User"; export async function getUserProfile(userId: string, guildId: string): Promise<IUser> { let user = await User.findOne({ userId, guildId }); if (!user) { user = await User.create({ userId, guildId }); } return user; }
二、MongoDB URL弃用警告
原因
使用的mongodb://协议URL对Atlas分片集群存在格式问题,Node.js未来版本会对这类无效URL抛出错误。Atlas集群更适配mongodb+srv://协议,它能自动处理分片、SSL等配置,避免手动拼接参数的错误。
解决步骤
- 获取官方标准URL:登录MongoDB Atlas控制台,进入目标集群,点击「Connect」→「Connect your application」,选择Node.js驱动版本,复制官方提供的
mongodb+srv://格式URL。 - 替换原有连接URL:将项目中的数据库连接URL替换为新的
srv格式,注意密码中的特殊字符(如@、$)已被自动URL编码。
示例正确URL格式:
mongodb+srv://<username>:<password>@cluster0.mongodb.net/DiscordBot?retryWrites=true&w=majority
无需手动添加replicaSet、ssl=true等参数,mongodb+srv会自动从DNS记录中获取相关配置。
内容的提问来源于stack exchange,提问作者Cxstin
相关产品推荐
相关产品推荐

