Транзакционный SQL с Sails.js

Итак, я немного играл с NodeJS/Express, и мне бы очень хотелось попытаться переписать относительно большой побочный проект, используя полный стек JavaScript, чтобы посмотреть, как он будет работать. Sails.js кажется довольно хорошим выбором для бэкэнда NodeJS для REST API с поддержкой сетевых сокетов, что именно то, что я ищу, но является еще одной проблемой, которую я ищу для решения, и это транзакционный SQL в NodeJS.

Большинство слоев данных/ормсов, которые я видел на стороне NodeJS, похоже, не поддерживают транзакции при работе с MySQL. ORM, поставляемый с Sails.js(Waterline), также, похоже, не поддерживает транзакции, которые являются странными, потому что я видел места, где упоминается, что это было, хотя эти комментарии довольно старые. У Knex.js есть поддержка транзакций, поэтому я задавался вопросом, легко ли заменить ORM на Sails.js этим (или если Sails.js предполагает Waterline в основной структуре).

Мне также интересно, есть ли ORM, построенный поверх Knex.js, помимо Книжной полки, поскольку я не являюсь поклонником системы моделей/коллекций Backbones?

Ответ 1

Вы все равно можете писать SQL-запросы напрямую с помощью Model.query(). Поскольку это асинхронная функция, вам придется использовать promises или async для ее повторной инициализации. Например, используя адаптер MySQL, async и модель под названием User:

async.auto({
  transaction: function(next){
    User.query('BEGIN', next);
  },
  user: ['transaction', function(next) {
    User.findOne(req.param('id')).exec(next);
  }],
  // other queries in the transaction
  // ...
}, function(err, results) {
  if (err) {
    User.query('ROLLBACK', next);
    return next(err);
  }
  User.query('COMMIT', next);
  // final tasks
  res.json(results.serialize);
});

Ответ 2

Мы работаем над собственной поддержкой транзакций на уровне ORM: https://github.com/balderdashy/waterline/issues/62

Ассоциации, скорее всего, на первом месте, но последующие транзакции. Мы только что закончили GROUP BY и агрегации (SUM, AVG и т.д.)

Ответ 3

Транзакции в SailsJS оказались намного сложнее, чем ожидалось. Цель состоит в том, чтобы позволить адаптеру ORM знать, что два очень разрозненных действия контроллера на моделях должны быть отправлены через одно соединение MySQL.

Естественный способ сделать это - написать новый адаптер, который принимает дополнительную информацию, чтобы указать, что запрос принадлежит транзакционному вызову. Для этого требуется изменение в waterline (модуль абзаца Sails ORM).

Оформить заказ, если это поможет - https://www.npmjs.com/package/sails-mysql-transactions