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

求助:提交评论时触发BSONTypeError,参数不符合ObjectId要求

解决BSONTypeError:参数必须是12字节字符串、24位十六进制字符串或整数的问题

错误原因

报错的核心问题出在mongoose.Types.ObjectId(interaction.user.id)这行代码:Discord的用户ID是纯数字组成的字符串,长度和格式都不符合MongoDB ObjectId的要求(必须是12字节二进制、24位十六进制字符串,或者合法整数),所以转换时抛出了类型错误。

解决方案

方案1:修改Schema字段类型(最直接)

如果reviewer字段不需要关联MongoDB中的其他集合,只是用来存储Discord用户ID,直接把Schema里的reviewer类型改成String:

// 示例Review子Schema定义
const ReviewSchema = new mongoose.Schema({
  _id: mongoose.Schema.Types.ObjectId,
  reviewer: { type: String, required: true }, // 改为String类型
  message: String,
  ratingText: String
});

// 对应的GuildSchema里的reviews字段
const GuildSchema = new mongoose.Schema({
  // 其他字段...
  reviews: [ReviewSchema]
});

然后修改代码,去掉不必要的ObjectId转换:

const reviewId = mongoose.Types.ObjectId();
const newReview = {
  _id: reviewId,
  reviewer: interaction.user.id, // 直接存入Discord用户ID字符串
  message: message,
  ratingText: ratingText,
};
guildData.reviews.push(newReview);
await guildData.save();

方案2:关联MongoDB用户集合(如果有)

如果你有专门存储Discord用户信息的MongoDB集合,那reviewer应该存储该用户在集合中的ObjectId,而不是Discord原生ID。比如先查询用户是否存在,再获取对应的ObjectId:

// 假设User是你的用户模型
const user = await User.findOne({ discordId: interaction.user.id });
if (!user) {
  // 处理用户不存在的情况,比如新建用户
  const newUser = new User({ discordId: interaction.user.id });
  await newUser.save();
}

const reviewId = mongoose.Types.ObjectId();
const newReview = {
  _id: reviewId,
  reviewer: user._id, // 使用MongoDB生成的ObjectId
  message: message,
  ratingText: ratingText,
};
guildData.reviews.push(newReview);
await guildData.save();

内容的提问来源于stack exchange,提问作者Maako Lmao

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.01 23:35:05