我在Sails.js应用程序中发现了一些我无法解释的内容:
客户端向UserController发送GET请求,如果UserController的帐户大于0,则UserController在该用户的TransactionTable中创建新记录,并将其帐户更新为0:
User.findOne(currentUser.id, function foundUser(err, foundUser) {
if(foundUser.account > 0){
//update the foundUsers account to 0
User.update(foundUser.id, {account:0}, function updateUser(err, updatedUser) {
//if error rollback;
//save the User to the Transactions Table:
Transactions.create(foundUser, function(){
//if error rollback;
return res.json("You will get Money!");
})
})
}else{
return res.json("Sorry you don't have enough Coins");
}
})
我在Clientside上为GET请求做了一个循环(5次重复),它只创建了1个Transaction,另外4个得到了FoundUser.account为0的日志。 所以输出是:
你会得到钱!
抱歉,您没有足够的硬币
抱歉,您没有足够的硬币
抱歉,您没有足够的硬币
抱歉,您没有足够的硬币
我使用POST执行相同的循环,并在表中创建了5个事务。
你会得到钱!
你会得到钱!
你会得到钱!
你会得到钱!
你会得到钱!
那么:GET原子和POST不在Sail.js应用程序中吗?这种生产安全吗?
编辑: GET请求是idempotent - 我使用GET测试了相同的循环,但这次我为每个参数请求添加了一个不同的值,得到了5个事务。
你会得到钱!
你会得到钱!
你会得到钱!
你会得到钱!
你会得到钱!
这种幂等如何运作?它与缓存无关吗?因为当它只是缓存已知请求的响应时,如第一个GET示例中那样,第一个示例也会返回相同响应的5倍?但它实际上“改变”了服务器上的资源并提供不同的响应。奇怪。
如何解决此问题?因此,在编写一个交易时,没有其他客户可以提出请求吗?
答案 0 :(得分:1)
我真的很喜欢帆,但是在我的谷歌搜索中,我总是碰到这篇关于它的缺点:https://kev.inburke.com/kevin/dont-use-sails-or-waterline/
文章中提到的两件事可能与您的问题有关:
我从未调查过第二个问题,但也许这意味着在同一个50毫秒间隔内收到的帖子请求会被收集并一次性传递出来?
答案 1 :(得分:0)