模型中有一个名为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'
");
谢谢
答案 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。