Nodejs API транзакций mongodb `withTransaction` всегда возвращает значение null - PullRequest
0 голосов
/ 05 мая 2020

Я хотел бы вернуть определенный результат из функции mongodb withTransaction. Однако я не могу вернуть из него ничего, кроме null.

В официальной документации указано, что обещание должно быть возвращено.

https://mongodb.github.io/node-mongodb-native/3.3/api/ClientSession.html

IMPORTANT: This method requires the user to return a Promise, all lambdas that do not
return a Promise will result in undefined behavior.

index. js

const mongodb = require('mongodb');

(async() => {
  const client = await mongodb.connect(url);
  const db = await client.db("testt");
  const session = client.startSession()

  const res =   session.withTransaction(async function() {
      return new Promise((resolve, reject) => {
        if(true) {
          resolve('laughed')
        } else {
          reject(`not laughing`);
        }
    })
  })
  console.log('result here')   //result here
  console.log(res)             //Promise { <pending> }
  console.log(await res);      //null
}) ()

Изменить: Поскольку функция asyn c всегда возвращает Обещание. Я заменил new Promise() простой строкой, но результат точно такой же, что сбивает с толку.

const res =   session.withTransaction(async function() {
  return `laughed`
})

1 Ответ

0 голосов
/ 05 мая 2020

В официальной документации указано, что обещание должно быть возвращено.

В документации говорится (выделено мной):

ВАЖНО: для этого метода требуется пользователь должен вернуть обещание, все лямбды, которые не возвращают обещание, приведут к неопределенному поведению.

Нет никаких утверждений, что обещание, которое вы возвращаете из обратного вызова, будет быть возвращенным из withTransaction. Я вообще не вижу описания возвращаемого значения withTransaction.

Текущая реализация, похоже, возвращает результат commitTransaction в качестве возвращаемого значения withTransaction, и этот результат выглядит как null в случае успешного commit.

Я считаю, что результат обещания, которое ваше приложение дает драйверу, отбрасывается здесь .

Итак, драйвер, похоже, ведет себя, как описано.

Если вы используете sh, вы можете подать заявку на расширение здесь .

...