【问题标题】:Validation error using `create()` in Mongoose transaction在 Mongoose 事务中使用`create()` 验证错误
【发布时间】:2019-02-26 15:50:07
【问题描述】:

我正在使用 mongoose 测试事务,并尝试使用以下代码完成一项非常简单的任务:

      const session = await mongoose.startSession();
      session.startTransaction();
      try {
        const opts = { session, new: true };
        const A = await Author.
        create({
          firstName: 'Jon',
          lastName: 'Snow'}, session);
        if(!A) throw new Error('Aborted A by Amit!');
        const B = await Author.
        findOneAndUpdate({firstName: 'Bill'}, {firstName: 'William'}, opts);
        if(!B) throw new Error('Aborted B by Amit!');
        await session.commitTransaction();
        session.endSession();
      } catch (err) {
        await session.abortTransaction();
        session.endSession();
        throw err;
      }

我要做的只是首先将一个新文档插入(使用 mongoose create() 方法)到集合中,然后编辑(使用 Mongo findOneAndUpdate() 方法)同一集合中的另一个文档。任一查询失败都需要中止整个事务套件。

似乎是create() 给我带来了问题。该文档确实被创建并插入,但是,它也会引发错误:

“作者验证失败:姓氏:需要路径lastName。, firstName:路径 firstName 是必填项。"

知道这意味着什么吗?尽管我已经给了它,但它似乎在抱怨没有为 required 字段(firstNamelastName)提供值。

【问题讨论】:

    标签: mongodb mongoose transactions


    【解决方案1】:

    我不知道为什么当我同时提供它们并且它们仍然被添加到集合中时它会抱怨缺失值!

    这是因为Model.create() 第一个参数接受要插入的文档,作为数组或作为展开。例如,这两个是等价的:

    // pass a spread of docs
    Candy.create({ type: 'jelly bean' }, { type: 'snickers' }) 
    
    // pass an array of docs 
    Candy.create([{ type: 'jelly bean' }, { type: 'snickers' }])
    

    您的行的问题在于,它试图将第二个文档{session: session} 作为Author 的另一个条目,它缺少必需的firstNamelastName 字段。

    你应该这样做:

    Author.create([{ firstName: 'Quentin', lastName: 'Tarantino' }], 
                   { session: session }
    );
    

    您还可以找到Transactions in Mongoose 一个有用的参考。

    【讨论】:

    猜你喜欢
    • 2019-05-04
    • 1970-01-01
    • 1970-01-01
    • 2015-03-30
    • 1970-01-01
    • 2022-01-01
    • 2021-01-29
    • 2017-09-10
    • 2012-11-14
    相关资源
    最近更新 更多