gpt4 book ai didi

javascript - 使用 mongodb (waterline.js) 和 node.js (sails.js) 解决事务

转载 作者:太空宇宙 更新时间:2023-11-04 02:07:31 24 4
gpt4 key购买 nike

鉴于这种情况:

-用户A发布了一个广告系列,其中上传了给定数量的照片。

-其他用户可以上传照片

-用户A可以接受上传的照片

-照片所有者每接受一张照片即可获得 1 硬币

-对于每张接受的照片,事件中可能的照片数量都会减少。

我像这样解决了“接受照片”功能(伪代码):

accept: function (req, res, next) {

var photos = req.param('photos'); // [1, 2, 5]
var campaign_id = req.param('campaign_id'); //1

Photo.update(photos, {status:'accepted'}).exec(function afterwards(err, updatedPhotos)
{
//get the users Ids from the updatedPhotos
// also know how many photos of each user were accepted

User.update(users){
//increase the amount of coins of this user
}

Campaign.update(amountOfAcceptedPhotos){
//decrease the amount of selectable photos.
}

})

}

首先一切都很顺利,直到我注意到当您使用相同的 photoID 快速发送相同的请求时,用户将为同一张照片获得多个硬币!我怎样才能防止这种情况发生?

如果您想查看确切的功能,这里是整个代码的链接: https://jsfiddle.net/zsmuoh0x/

最佳答案

我编写了一个库,它实现了docs中描述的两阶段提交系统。 。在这种情况下它可能会有所帮助。 Fawn - Transactions for MongoDB 。示例:将 20 美元从一个银行账户转入另一个银行账户

var Fawn = require("Fawn");

// intitialize Fawn
Fawn.init("mongodb://127.0.0.1:27017/testDB");

/**
optionally, you could initialize Fawn with mongoose

var mongoose = require("mongoose");
mongoose.connect("mongodb://127.0.0.1:27017/testDB");
Fawn.init(mongoose);
**/

// after initialization, create a task
var task = Fawn.Task();

// assuming "Accounts" is the Accounts collection
task.update("Accounts", {_id: "Sender"}, {$inc: {balance: -20}})
.update("Accounts", {_id: "Reciever"}, {$inc: {balance: 20}})
.run()
.then(function(results){
// task is complete

// result from first operation
var firstUpdateResult = results[0];

// result from second operation
var secondUpdateResult = results[1];
})
.catch(function(err){
// Everything has been rolled back.

// log the error which caused the failure
console.log(err);
});

关于javascript - 使用 mongodb (waterline.js) 和 node.js (sails.js) 解决事务,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43666742/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com