使用修改后的mongoose-uuid2会中断保存操作

时间:2019-08-24 20:25:44

标签: node.js mongoose uuid

因此,我一直在与猫鼬中嵌套UUID的问题作斗争,这在以下堆栈溢出文章中概述了

Mongoose and array of ref UUID's does not convert

但是,经过更多的测试和研究,我发现这破坏了我代码的另一部分,该代码用于更新我用于系统的文档。由于此代码很复杂,因此我将提供一个创建相同条件的简单示例。

在安装以下nodejs软件包后

  

“猫鼬”:“ ^ 5.6.10”,   “ mongoose-uuid2”:“ ^ 2.3.0”,   “ uuid”:“ ^ 3.3.3”,   “ uuid-mongodb”:“ ^ 2.1.1”

然后,按照上一篇文章中的概述更新mongoose-uuid2 index.js文件。

并最终设置以下代码来演示该问题:

var mongoose = require('mongoose');
var uuid = require("uuid-mongodb");
var Schema = mongoose.Schema;
require('mongoose-uuid2')(mongoose);
var UUID = mongoose.Types.UUID;

var TestISchema = Schema({
  _id: { type: UUID, default: uuid.v4, required: true },
  name: { type: String, required: true }
}, { id: false, toObject: {
  "getters": true,
  "virtuals": true,
  "transform": function(doc, ret, options) {
    delete ret._id;
    return ret;
  }
}, toJSON: {
  "getters": true,
  "virtuals": true,
  "transform": function(doc, ret, options) {
    delete ret._id;
    return ret;
  }
} });

var TestIISchema = Schema({
  _id: { type: UUID, default: uuid.v4, required: true },
  name: { type: String, required: true },
  testIs: [{ type: UUID, ref: 'Product' }]
}, { id: false, toObject: {
  "getters": true,
  "virtuals": true,
  "transform": function(doc, ret, options) {
    delete ret._id;
    return ret;
  }
}, toJSON: {
  "getters": true,
  "virtuals": true,
  "transform": function(doc, ret, options) {
    delete ret._id;
    return ret;
  }
} });

TestIISchema.virtual("id").get(function() {
  return uuidv4.from(this._id).toString();
});

TestIISchema.virtual("id").set(function(uuid_string) {
  this._id = uuid.from(uuid_string);
});

TestISchema.virtual("id").get(function() {
  return uuid.from(this._id).toString();
});

TestISchema.virtual("id").set(function(uuid_string) {
  this._id = uuidv4.from(uuid_string);
});

mongoose.connect('mongodb://localhost:27017/test', {useNewUrlParser: true});

var TestIModel = mongoose.model('TestI', TestISchema);
var TestIIModel = mongoose.model('TestII', TestISchema);

console.log(`Creating a new Test I document`);
var mytestI = new TestIModel({ "name": "testproduct"});

console.log(`Saving a Test I document`);
mytestI.save().then(() => {
  console.log(`Getting all of Test I documents`);
  return TestIModel.find({});
})
.then((results) => { 
  console.log(`Assigning Test I documennt ID's to an Test II document`);
  var testIuuids = [];
  results.forEach((result) => {
    testIuuids.push(result.id);
  });
  mytestII = new TestIIModel(
    { 
      "name": "testIIproduct", 
      "testIs": testIuuids 
    }
  );
  return Promise.resolve(mytestII);
})
.then((doc) => {
  console.log(`Saving Test II`);
  return doc.save();
})
.then((result) => {
  console.log(result);
  console.log(`Getting Test II by id ${result.id}`);
  return TestIIModel.findById(result.id);
})
.then((document) => {
  document.name = "testIIproduct2";
  document.testIs = []
  return document.save();
})
.then((result) => {
  console.log(result);
})
.catch((error) =>{
  console.log(error);
  mongoose.disconnect();
});

在安装并执行以下错误后,最后一次保存会发生

  

路径_id是必需的。

在进行故障排除并通过调试器运行它时,我可以看到代码经过更新的修补代码,并且如果我删除了上一篇文章中概述的mongoose-uuids的更新代码,它可以工作。但是,该帖子中概述的我以前的问题又回来了。我还尝试删除模式的第8行和第27行的“ required:true”,这在第96行的findById中产生了另一个错误:

  

未找到用于查询“ {_id:\'eacdf837-ee2c-4c61-9271-744234b67868 \'}的文档

我还尝试将第96行的findById更改为TestIIModel.find({“ id”:result.id}),但是模型找不到文档。

我对大文章表示歉意,但是如果没有所有这些信息,我找不到重新创建此问题的方法。同样作为背景,以这种方式使用UUID是必需的。我为此感到困惑,因此在此问题上的任何帮助将不胜感激。

1 个答案:

答案 0 :(得分:0)

我能够找到此问题的解决方案。答案发布在

Mongoose and array of ref UUID's does not convert

它是对mongoose-uuid2库软件包的修改。

这是将第51行更改为57

if (value instanceof mongoose.Types.Buffer.Binary) {
    if (init && doc instanceof mongoose.Types.Embedded) {
      return getter(value);
    } else {
      return value;
    }
  }