如何用sails.js/waterline进行交易?

How to make transactions with sails.js/waterline?

我正在尝试将我的查询放入事务中,但我在运行时失败了。我得到的错误是:

Object #<bound> has no method 'transaction'

我试着关注 this "documentation".

简而言之,我的模型是这样的:

updateOrCreate: function (profile_id, positive,negative) {
  var deferred = Q.defer();

  Reputation.transaction().findOne().where({profile: profile_id}).then(function (rep) {
    if (rep) {
      // Reputation logic

      rep.save(function (err) {deferred.resolve();});
    } else {
      // Reputation does not exist. Create.
      Reputation.create({profile: profile_id, positive: positive,negative:negative}).exec(function (e, rep) {
        deferred.resolve();});
    }
  }).fail(function (err) {deferred.reject()});

  return deferred.promise;
}

有什么想法我做错了什么吗?

谢谢。

w.

您正在关注的 "documentation" 是关于如何 可以将事务支持添加 到 Sails 的提案。 Sails 中没有本机事务支持。有关如何使用 MySQL 或 Postgres 适配器的 .query 方法执行事务的示例,请参阅 this answer

似乎 they don't support this。你可以使用类似的东西:

sails v1 现在支持此功能(2017 年 6 月 26 日尚未正式发布)。 您可以按照此 link 获取 next.sailsjs.com 中的文档: Datastore.transaction()

在上面的文档中有以下示例:

sails.getDatastore()
.transaction(function (db, proceed) {

  BankAccount.findOne({ owner: req.session.userId }).usingConnection(db)
  .exec(function (err, myAccount) {
    if (err) { return proceed(err); }
    if (!myAccount) { return proceed(new Error('Consistency violation: Database is corrupted-- logged in user record has gone missing')); }

    BankAccount.findOne({ owner: req.param('recipientId') }).usingConnection(db)
    .exec(function (err, recipientAccount) {
      if (err) { return proceed(err); }
      if (!recipientAccount) {
        err = new Error('There is no recipient with that id');
        err.code = 'E_NO_SUCH_RECIPIENT';
        return proceed(err);
      }

      // Do the math to subtract from the logged-in user's account balance,
      // and add to the recipient's bank account balance.
      var myNewBalance = myAccount.balance - req.param('amount');

      // If this would put the logged-in user's account balance below zero,
      // then abort.  (The transaction will be rolled back automatically.)
      if (myNewBalance < 0) {
        err = new Error('Insufficient funds');
        err.code = 'E_INSUFFICIENT_FUNDS';
        return proceed(err);
      }

      // Update the current user's bank account
      BankAccount.update({ owner: req.session.userId })
      .set({
        balance: myNewBalance
      })
      .usingConnection(db)
      .exec(function (err) {
        if (err) { return proceed(err); }

        // Update the recipient's bank account
        BankAccount.update({ owner: req.param('recipientId') })
        .set({
          balance: recipientAccount.balance + req.param('amount')
        })
        .usingConnection(db)
        .exec(function (err) {
          if (err) { return proceed(err); }
          return proceed();
        });
      });
    });
  });

}).exec(function(err){
  // At this point, we know that, if our code above passed through
  // an error to `proceed`, Sails took care of rolling back the
  // transaction.  Otherwise, it committed it to the database.
  if (err && err.code === 'E_INSUFFICIENT_FUNDS') {
    return res.badRequest(err);
  }
  else if (err && err.code === 'E_NO_SUCH_RECIPIENT') {
    return res.notFound();
  }
  else if (err) {
    return res.serverError(err);
  }

  // All done!
  return res.ok();

});