Сделка в перьях js с использованием возражения ОРМ - PullRequest
0 голосов
/ 11 февраля 2020

перо-возражение - Сервисный адаптер для Возражение. js - Минимальный SQL ORM, построенный поверх Knex.

Транзакции являются атомами c и изолированными единицами работы в реляционных базах данных.

Мы хотим создать и использовать транзакцию в приложении перьев js, сгенерированном с помощью интерфейса командной строки Feathers.

Но

Нам не удалось выяснить, как создать объект транзакции и передать его в серию вызовов службы, используя оператор параметров транзакции, и как использовать await Transactions.trx. commit () и await Transactions.trx.rollback () .

Для того же требуется справка.

Ответы [ 2 ]

0 голосов
/ 12 февраля 2020

удалось достичь транзакции в перьях js с помощью возражения ORM.

Выводы следующие.

ловушки транзакций

const {transaction} = require('objection');
// Use this hook to manipulate incoming or outgoing data.
// For more information on hooks see: http://docs.feathersjs.com/api/hooks.html
// eslint-disable-next-line no-unused-vars
const start = (options = {}) => {
  return async context => {
    const { service } = context;
    const Model = service.Model;
    const trx = await transaction.start(Model); // use Model if you have installed a knex instance globally using the Model.knex() method, otherwise use Model.knex()
    context.params.transaction = { trx };
    return context;
  };
};
const commit = (options = {}) => {
  return async context => {
    const { transaction } = context.params;
    await transaction.trx.commit();
    return context;
  };
};
const rollback = (options = {}) => {
  return async context => {
    const { transaction } = context.params;
    await transaction.trx.rollback();
  };
};
module.exports = {
  _transaction: {
    start,
    commit,
    rollback
  }
};

Затем в вашем service.hooks используйте следующее:

const {_transaction} = require('../../hooks/transaction-hooks');
module.exports = {
  before: {
    all: [],
    find: [],
    get: [],
    create: [_transaction.start(),createRideData],
    update: [],
    patch: [],
    remove: []
  },
  after: {
    all: [],
    find: [],
    get: [],
    create: [updateRideRequestStatus, _transaction.commit()],
    update: [],
    patch: [],
    remove: []
  },
  error: {
    all: [],
    find: [],
    get: [],
    create: [_transaction.rollback()],
    update: [],
    patch: [],
    remove: []
  }
};

Также можно начать транзакцию с экземпляром knex:

const start = (options = {}) => {
  return async context => {
    const { service, app } = context;
    const knex = app.get('knex');
    const trx = await transaction.start(knex);
    context.params = {
      ...context.params,
      transaction: {
        trx
      }
    }
    return context;
  };
};
0 голосов
/ 12 февраля 2020

Проверка knex.transcationProvider() пример из https://knexjs.org/#Transactions

Однако в документации, где вызываются await trx.commit() и await trx.rollback(), может быть ошибка.

Более безопасный способ - просто вызвать любой из тех, у кого нет await и await trx.executionPromise, чтобы получить результат / ошибку транзакции, если она была откатана.

Документация по транзакциям в knex в настоящее время довольно грязная.

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