在模型的路径“ _id”处将值“”转换为ObjectId失败

时间:2019-02-01 17:32:16

标签: node.js mongodb mongoose

我已经检查了StackOverflow上的其他条目,但没有帮助。

我建立一个RESTapinode.js,以及我使用MongoDBmongoose 我有一个Schema,其中包含三种不同的模型。我能够将POST请求保存到条目。我确定该条目已保存,因为我选中了atlas.mongo。但是,当我尝试使用GET请求时遇到问题。

出现此错误:

  

Cast即可的ObjectId失败值 “” 在路径 “_id” 为模型

这些是我的模型 :(这些模型位于不同的文件中)

const Model1 = mongoose.Schema({
    _id: mongoose.Schema.Types.ObjectId,
    word1: { type: [String], require: true }
});
----------------------------------------------
const Model2 = mongoose.Schema({
    _id: mongoose.Schema.Types.ObjectId,
    word2: { type: [String], require: true }
});
----------------------------------------------
const Model3 = mongoose.Schema({
   _id: mongoose.Schema.Types.ObjectId,
   element1: { type: [String],  default: ""},
   element2: { type: [String], default: ""}
});
----------------------------------------------
const Word = mongoose.Schema({
   _id: mongoose.Schema.Types.ObjectId,
   md3: { type: mongoose.Schema.Types.Mixed, ref: 'Model3', require: true },
   md2: { type: mongoose.Schema.Types.Mixed, ref: 'Model2', require: true },
   md1: { type: mongoose.Schema.Types.Mixed, ref: 'Model1', require: true }
});

这是我的 POST 请求:

exports.entry_create = (req, res, next) => {
const newModel3 = new Model3({
    _id: new mongoose.Types.ObjectId(),
    element1: req.body.element1,
    element2: req.body.element2
});

const newModel2 = new Model2({
    _id: new mongoose.Types.ObjectId(),
    word2: req.body.word2
});

const newModel1 = new Model1({
    _id: new mongoose.Types.ObjectId(),
    word1: req.body.word1
});

const newEntry = new Word({
    _id: new mongoose.Types.ObjectId(),
    md3: newModel3,
    md2: newModel2,
    md1: newModel1
});

newEntry
    .save(); // i have also then() and catch() part
};

这是我在Postman上遇到错误的地方

exports.entry_get_all = (req, res, next) => {
Word.find()
    .select('_id md3 md2 md1')
    .populate('md3')
    .populate('md2')
    .populate('md1')
    .exec()
    .then(docs => {
        res.status(200).json({
            numOfEntries: docs.length,
            Entries: docs.map(doc => {
                return {
                    _id: doc._id,
                    md3: doc.md3,
                    md2: doc.md2,
                    md1: doc.md1,
                    request: { type: 'GET' }
                }
            })
        });
    }); // i have also catch() part
};

可能是什么问题?为_id的{​​{1}}返回md3, md2 & md1

1 个答案:

答案 0 :(得分:1)

我认为这与您引用的md1,md2和md3有关。引用另一个模型的方式是通过_id(在您的情况下为_id)和ObjectId。话虽如此,当您定义md1,md2和md3时,您说的是混合类型,而不是ObjectId。改为这样做:

const Word = mongoose.Schema({
  _id: mongoose.Schema.Types.ObjectId,
  md3: { type: mongoose.Schema.Types.ObjectId, ref: 'Model3', require: true },
  md2: { type: mongoose.Schema.Types.ObjectId, ref: 'Model2', require: true },
  md1: { type: mongoose.Schema.Types.ObjectId, ref: 'Model1', require: true }
});

还请注意:创建模型实例时,无需显式创建新的ObjectId。如果使用猫鼬,它将为您创建_id!因此,您可以像这样创建新的Word

let md1 = null;
let md2 = null;
let md3 = null;

const newModel3 = new Model3({
  element1: req.body.element1,
  element2: req.body.element2
});

// Save newModel3
newModel3.save()
.then((_md3) => {
  md3 = _md3;

  const newModel2 = new Model2({
    word2: req.body.word2
  });

  return newModel2.save();
})
.then((_md2) => {
  md2 = _md2;

  const newModel1 = new Model1({
    word1: req.body.word1
  });

  return newModel1.save();
})
.then((_md1) => {
  md1 = _md1

  const newEntry = new Word({
    md3: md3._id,
    md2: md2._id,
    md1: md1._id
  });

  return newEntry.save();
})