Ошибка проверки с использованием `create ()` в транзакции Mongoose - PullRequest
0 голосов
/ 22 февраля 2019

Я тестирую транзакции, используя 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: путь lastName., FirstName: путь firstName требуется».

Есть идеи, что это может значить?Кажется, он жалуется на то, что ему не были даны значения для полей required (firstName и lastName), несмотря на то, что я уже дал эти значения.

1 Ответ

0 голосов
/ 26 февраля 2019

Я понятия не имею, почему он будет жаловаться на пропущенные значения, когда я предоставил их оба, и они все еще добавляются в коллекцию!

Это потому, что 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, в которой отсутствует требуемый firstName и lastName поля.

Вместо этого вы должны сделать:

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

Вы также можете найти Транзакции в Mongoose полезной ссылкой.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...