gpt4 book ai didi

javascript - 在 MongoDB 中使用 nonce 进行并发编辑

转载 作者:行者123 更新时间:2023-11-30 17:07:54 25 4
gpt4 key购买 nike

我正在使用 Expressjs、Socket.io 和 Mongoose 制作一款多人游戏。玩家加入游戏,当有足够的玩家可以玩时开始。我同时提醒游戏中的所有玩家游戏可以开始,所以我遇到了将游戏状态更改为“正在玩”并初始化 Angular 色的并发问题。有时 Angular 色会被分配两次,这会扰乱游戏玩法。

我尝试按照建议添加随机数 herehere ,但我无法让它工作,我也不是很理解。 MongoDB 是否将其视为具有特殊属性的特殊值?还是随机数取决于 MongoDB 的某些现有属性?

这是游戏模型的相关部分:

GameSchema = mongoose.Schema
nonce:
type: mongoose.Schema.Types.ObjectId
required: true
default: mongoose.Types.ObjectId
name:
type: String
required: true
unique: true
state:
type: String
enum: ["setup", "unstarted", "playing", "assassinating", "good_won", "bad_won", "discontinued"]
default: "setup"
required: true
characters: [String]
players: [{ type: mongoose.Schema.Types.ObjectId, ref: "Player" }]

GameSchema.statics.findByIdAndStart = (id, done) ->
Game = this

Game.findById id, (err, game) ->
return done err, game if err or game.state is "playing"

changes =
state: "playing"
nonce: mongoose.Types.ObjectId()
Game.update { id: id, nonce: game.nonce }, changes, (err) ->
return done err if err

Game.findById(id).populate("players").exec (err, game) ->
return done err if err

characterSelection = new CharacterSelection game.characters

async.eachSeries game.players, ((player, next) ->
player.character = characterSelection.assignCharacter()
player.save next
), (err) -> done err, game

如何防止同时编辑我的模型?

最佳答案

将模型的属性命名为“nonce”并没有什么特别之处,它只是一个术语/约定,意思是“仅使用一次”,我们要求它在每次生成时都是唯一的。

您将随机数定义为 MongoDB 中的 ObjectId,这样每次生成它时您都应该获得一个唯一值。

这项工作的关键是,当您调用 update() 时,您使用文档的现有随机数值,以便您的更新确保在您发出 findById() 和调用更新方法。如果更新成功,您的文档将获得您放入更改对象中的新生成的现时值。

看看你的代码,我认为它看起来是正确的,除了你没有处理更新没有更改任何记录的情况,只有错误情况。更新回调 ( in Mongoose 3.8.x ) 采用第二个参数 numberAffected,您可以使用它来确定是否有文档受到影响。

Game.update { id: id, nonce: game.nonce }, changes, (err, numberAffected) ->
return done err if err
return done "Conflict!" if !numberAffected

您需要决定如何处理冲突情况,在 this example 中,代码会在出错之前重试调用多次。

关于javascript - 在 MongoDB 中使用 nonce 进行并发编辑,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27584564/

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