在环回中使用远程方法增加模型中的字段?

时间:2016-11-23 02:01:29

标签: mysql node.js rest loopbackjs strongloop

模型中有一个名为counter的字段,无论何时调用自定义远程方法(如

Request URL
http://loopback:3000/api/models/increment_counter

Request body 
EMPTY

Response
{
   "counter" : [Value after Increment]
}

目前要增加首先我必须从db获取计数器值并将其增加一并更新couter值,这涉及两个查询,是否可以在单个NodeAPI调用中执行此操作,如下面的mysql查询。我是目前使用Mysql作为DB。

mysql_query("
    UPDATE model 
    SET counter = counter + 1
    WHERE model_id = '1'
");

谢谢

2 个答案:

答案 0 :(得分:2)

考虑到你想要的MySQL语法,你似乎需要一个原子计数器

数据库事务

使用MySQL连接器,您可以使用database transactions。它受MySQL连接器支持。对于原子计数器而言,它有点矫枉过正,但它会完成工作。

以下是自定义远程方法

中的示例
MyModel.someRemoteMethodForIncrementing = function(callback) {
  // Start the transaction
  MyModel.beginTransaction({
    isolationLevel: MyModel.Transaction.READ_COMMITTED
  }, function(err, tx) {
    // Retrieve the current counter value as part of the transaction
    MyModel.findById(id, {
      transaction: tx
    }, function(err, data) {
      if (err) {
        console.log(err);
        return tx.rollback(function(err) {
          callback(err);
        });
      }

      // Increment the counter as part of the transaction
      var inc = data.counter + 1;

      MyModel.updateAttributes({
        counter: inc
      }, {
        transaction: tx
      }, function(err, newData) {
        if (err) {
          console.log(err);
          return tx.rollback(function(err) {
            callback(err);
          });
        }

        // Commit the transaction to make it happen
        tx.commit(function(err) {
          if (err) return callback(err);
          // Counter should have been incremented
          callback();
        });
      });
    });
  });
};

我还没有对它进行测试,但它应该可以使用,让我知道

扩展运营商

将来,您将能够使用$inc (increment) extended operator,但到目前为止它只受MongoDB连接器支持,而不是MySQL。

仅供参考,这是语法(仅适用于MongoDB

PUT api/Model/:id?filter={"$inc":{"name":propertyToIncrement, "count":incrementAmount}} 

我正在尝试获得持续PR以获得MySQL支持,但在合并之前需要many things

答案 1 :(得分:0)

是的,您可以在单个环回远程方法调用中执行此操作。假设您在请求中发送了一个ID

yourModel.remoteMethod = function(data, cb){
    yourModel.findById(data.id, function(err, object){
      if(err){
        cb(err, null);
      }
      object.counter += 1;
      object.save(function(saveErr, afterSaveObj){
        cb(saveErr, afterSaveObj.counter);
      })
    });
}

这里cb是一个回调,loopback传递给你的remoteMethod。