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

Discord机器人MongoDB经济系统报错:cash/bank属性不存在及弃用警告

问题解决指南

一、TypeScript类型错误:cash/bank 属性不存在

原因

定义Mongoose模型时,错误将typeof UserSchema作为泛型参数传入model(),导致TypeScript无法正确推断文档属性类型,因此识别不了cash和bank字段。

解决步骤

  1. 定义用户文档接口:在User.ts中创建对应Schema结构的TypeScript接口,明确各属性类型。
  2. 修正模型泛型参数:将模型的泛型参数改为自定义接口,而非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");
  1. 修正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等配置,避免手动拼接参数的错误。

解决步骤

  1. 获取官方标准URL:登录MongoDB Atlas控制台,进入目标集群,点击「Connect」→「Connect your application」,选择Node.js驱动版本,复制官方提供的mongodb+srv://格式URL。
  2. 替换原有连接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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.03 15:27:37