首页 > 解决方案 > 在路径“值”处为值“值”转换为 ObjectId 失败

问题描述

我有两个模式用户和消息。当我尝试插入消息模式时,它会引发主题错误。我的期望是它应该在消息模式中添加用户的 _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.jsmongodbmongoosemongoose-schema

解决方案


在分配之前检查params.MessageTo并且params.messageFrom是 ObjectId 类型:

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

推荐阅读