猫鼬交易中使用`create()`的验证错误

时间:2019-02-22 16:24:49

标签: mongodb mongoose transactions

我正在使用猫鼬测试交易,并尝试使用以下代码完成一个非常简单的任务:

      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:路径lastName是必需的。,   firstName:路径firstName是必需的。“

任何想法都意味着什么?似乎有人抱怨尽管我已经给了required字段(firstNamelastName)一个值。

1 个答案:

答案 0 :(得分:3)

  

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

这是因为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有用的参考。