模型中有一个名为计数器的字段,每当我调用自定义远程方法时,如下所示
Request URL
http://loopback:3000/api/models/increment_counter
Request body
EMPTY
Response
{
"counter" : [Value after Increment]
}
目前,我首先必须从DB中获取计数器值,然后将其增量为1,并更新couter值,这涉及到两个查询,是否可以在下面的mysql查询这样的单个NodeAPI调用中完成,我目前正在使用Mysql作为db。
mysql_query("
UPDATE model
SET counter = counter + 1
WHERE model_id = '1'
");
谢谢
发布于 2016-11-23 01:18:47
考虑到您需要的MySQL语法,您似乎需要一个原子计数器。
数据库事务
使用MySQL连接器,您可以使用数据库事务。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 (增量)扩展算子,但到目前为止,它只受MongoDB连接器的支持,而不是MySQL。
仅供参考,以下是语法(仅适用于MongoDB)
PUT api/Model/:id?filter={"$inc":{"name":propertyToIncrement, "count":incrementAmount}}
发布于 2016-11-22 23:04:21
是的,您可以在一个回环远程方法调用中完成这个任务。假设您在请求中发送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是一个回调,环回传递给您的remoteMethod。
https://stackoverflow.com/questions/40754819
复制相似问题