【问题标题】:Mongoose pre save hook set auto increment ID in documentMongoose 预保存挂钩在文档中设置自动增量 ID
【发布时间】:2019-06-15 07:43:55
【问题描述】:

之前有人问过几个类似的问题,但我无法找到任何适用于此用例的解决方案。

我正在尝试编写一个预提交挂钩,每次保存新的“记录”文档时都会生成一个自动递增的 ID 号。

自动增量 ID 的创建正在运行。我可以通过检查 console.log 来验证这一点。

问题是没有在保存的文档上设置 RecordID。文档使用在 save() 调用中设置的正确值保存,但不是在预保存挂钩中设置的 RecordID。

记录模型

async function getNextSequence(name) {

  let seq, result;

  try {
    result = await counters.findOneAndUpdate({
      _id: name
    }, {
      // Increment sequence by 1
      $inc: { seq: 1 }
    });
  }
  catch (error) {
    console.error(`getNextSequence failed ${error}`);
  }

  return result.seq;

}

// Pre save hook
RecordsSchema.pre('save', (next) => {
  // Get document being saved
  let record = this;

  // Get next RecordID auto increment number
  getNextSequence('RecordID').then(nextID => {
    // Set RecordID
    if (nextID) {
      record.RecordID = nextID;
    }
    // nextID is showing up correctly
    // record object also shows up correctly in the log,
    // but it does NOT show up in the database
    console.log(`RecordsSchema.pre ${nextID} ${JSON.stringify(record)}`);
    next();
  }).catch((error) => {
    console.error(`getNextSequence failed ${error}`);
  });

});

记录 save() 调用

router.post('/', (req, res, next) => {

  let record = new records();
    record.Title = req.body.Title;
    record.Location = req.body.Location;

  record.save().then(record => {
    res.status(200).json(record);
  }).catch((error) => {
    console.log(`${origin} ${error}`);
    res.status(500).send('Server error');
  });

});

结果

记录标题和位置正在正确保存。但是,没有保存 RecordID。我也尝试过使用 post save hook,但同样的问题正在发生。

RecordsSchema.post('save', (doc) => {
  // Get document being saved
  let record = doc;

  // Get next RecordID auto increment number
  getNextSequence('RecordID').then(nextID => {
    // Set RecordID
    if (nextID) {
      record.set( { RecordID: nextID } );
    }
    console.log(`RecordsSchema.post ${nextID} ${JSON.stringify(record)}`);
    //next();
  }).catch((error) => {
    console.error(`getNextSequence failed ${error}`);
  });

});

【问题讨论】:

    标签: node.js mongoose hook


    【解决方案1】:

    我将箭头函数更改为函数表达式来解决这个问题。 arrow function 不绑定到 this 关键字。在这种情况下需要一个函数表达式,因为 Mongoose 保存挂钩返回绑定到 this 关键字的正在保存的文档。

    // Pre save hook
    RecordsSchema.pre('save', function(next) {
      // Get document being saved
      let record = this;
    
      // Get next RecordID auto increment number
      getNextSequence('RecordID').then(nextID => {
        // Set RecordID
        if (nextID) {
          record.RecordID = nextID;
        }
        next();
      }).catch((error) => {
        console.error(`getNextSequence failed ${error}`);
      });
    
    });
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2021-04-21
      • 2016-09-18
      • 2015-08-29
      • 2017-04-18
      • 1970-01-01
      • 1970-01-01
      • 2020-05-13
      • 1970-01-01
      相关资源
      最近更新 更多