【问题标题】:Cast to ObjectId failed for value "value " at path "value"路径“值”处的值“值”转换为 ObjectId 失败
【发布时间】:2022-03-25 02:31:32
【问题描述】:

我有两个模式用户和消息。当我尝试插入消息模式时,它会引发主题错误。我的期望是它应该在消息模式中添加用户的 _Id,但我无法弄清楚。我不知道它会抛出验证错误。 这是我的用户架构:

var mongoose = require('mongoose')
var UserSchema = new mongoose.Schema({
  userId: { type: String, createIndexes: { unique: true, required: true, trim: true } },
  imagePath: String,
  name: {
    first: String,
    middle: String,
    last: String,
  },
  mobileNumber: String,
  onlineStatus: {
    type: String,
    default: 'Online'
  },
  accountStatus: {
    type: String,
    default: 'Active'
  },
  lastSeen: Date,
  socketId: String,
  pushToken: String,
  country: String,
  city: String,
  ipAddress: String,
  timeZong: String,
  continent: String,
  createdAt: {
    type: Date,
    default: Date.now
  },
  lastUpdated: {
    type: Date,
    default: Date.now
  }

});


UserSchema.pre('save', function (next) {
  if (!this.createdAt) {
    this.createdAt = new Date().now;
  }
  if (!this.accountStatus) {
    this.accountStatus = "Active";
  }
  next();
});
module.exports = mongoose.model('Users', UserSchema)  
  

这是消息架构

let mongoose = require('mongoose')
let userSchema = new mongoose.Schema({
    message: String,
    messageTo:
    {
        type: mongoose.Schema.Types.ObjectId,
        ref: "Users",
        required: 'To id cannot be empty',
    },
    messageFrom:
    {
        type: mongoose.Schema.Types.ObjectId,
        ref: "Users",
        required: 'From id cannot be empty',
    },
    messageRead: { type: Number, default: 0 },
    receiverDeleted: { type: Number, default: 0 },
    senderDeleted: { type: Number, default: 0 },
    sendDate: {
        type: Date,
        default: Date.now()
    },
    receivedDate: Date
})
module.exports = mongoose.model('Messages', userSchema)

这就是我尝试插入的方式。

var message = new ModelMessages();
message.message = params.message;
message.messageTo = params.messageTo;
message.messageFrom = params.messageFrom;
message.save((err, doc) => {
    if (err) {
        logger.error(`Unable to send IM. ${err} Stacktrace: ${err.stack}`);
    } else if (doc) {
        logger.info(`Sending message to recievers.`);
    }
});

【问题讨论】:

    标签: node.js mongodb mongoose mongoose-schema


    【解决方案1】:

    在分配之前检查params.MessageToparams.messageFrom 是否属于ObjectId 类型:

    var ObjectId = mongoose.Types.ObjectId;
    try {
      message.messageTo = ObjectId(params.MessageTo)
      message.messageFrom = ObjectId(params.messageFrom)
    } catch(err) {
      console.error(err)
    }
    

    【讨论】:

      【解决方案2】:

      你需要检查id是否有效

      mongoose.Types.ObjectId.isValid('your id here');

      但是有一种情况,即使是12字节的字符串也可以通过上述方法有效。你的messageTomessageFrom 不是mongoose id 类型

      或者您甚至可以将类型更改为string 甚至

      【讨论】:

        【解决方案3】:

        在我的程序中发生此错误是因为

        之前(错误):

        <a href="/admin/posts/edit/**:**{{_id}}">
           <button class="btn btn-success mt-4">Edit post</button>
        </a><br>
        

        之后(成功):

        <a href="/admin/posts/edit/{{_id}}">
            <button class="btn btn-success mt-4">Edit post</button>
        </a><br>
        

        尝试在你的程序中找到类似的东西。

        【讨论】:

          猜你喜欢
          • 2020-04-18
          • 2014-06-20
          • 2017-05-19
          • 2017-11-10
          • 2016-11-11
          • 2017-03-26
          • 2017-05-26
          • 2020-05-20
          • 1970-01-01
          相关资源
          最近更新 更多