2015-09-07 56 views
1

我試圖更新一個socketId''每當用戶斷開連接。但不知何故,我總是收到此錯誤mongoose更新總是給我TypeError:不能設置屬性'__v'undefined

update.$setOnInsert[this.schema.options.versionKey] = 0; 
                 ^
TypeError: Cannot set property '__v' of undefined 

例如我的目標,如果有人斷開

socketId = ZH_Ic0zD8QkmNYuJAAAE; 
will be 
socketId = ''; 

下面的代碼

socket.on('disconnect', function() { 
    console.log(socket.id); 
    var disconnectSocketId = ''; 
    User.findOneAndUpdate({socketId: socket.id}, disconnectSocketId, {upsert: true, new: true}, function(err, doc) { 
     if (err) { 
     return console.error 
     } 

     console.log(doc.socketId); 
    }); 
    }); 

回答

1

有幾個與你的代碼的問題。

更新:通過socket.id作爲query對象的問題顯然已經解決了您的問題的最新編輯。

最重要的是,TypeError指示顯然沒有對象update.$setOnInsert(我知道this.schema.options.versionKey包含字符串"__v"),所以你試圖給一個未定義的對象分配一個屬性。你應該先以某種方式初始化:

var update = { 
    $setOnInsert: {}, 
    $set: {} 
    ... 
} 

如果我有你的權利,你想通過$setOnInsert對象作爲文檔對象的一部分findOneAndUpdate(),對不對?您的函數參數化看起來不正確:disconnectSocketId應該保存帶有要更新的字段的文檔對象,但只傳遞一個空字符串。由於查詢對象看起來不正確,因此只傳遞socket.id。此外:您是否確定要通過清除標識符來更新記錄...?最後:請注意,如果您通過域名更新使用$setOnInsert,那麼如果您查詢的記錄已存在(即具有該ID),這實際上不會更新您的數據。

假設update代表持股約字段信息的對象,他們應該如何更新,我認爲你正在試圖做類似這樣的:

User.findOneAndUpdate({ socketId: socket.id }, update, { upsert: true, new: true }, function(err, doc) { 
    ... 
} 

請務必檢查mongoDB docs for $setOnInsertmongoose docs for findOneAndUpdate

+0

感謝您花時間回答這個問題,我想更新socketId的原因是因爲我在User Schema中有socketId字段。所以,只要具有相同socketId值的特定用戶斷開連接,那麼我希望他的socketId爲空字符串或null。 –

+0

目前我正在使用正常查找然後保存方法來解決這個問題 –

+0

@JackMoscovi好的,但是您是否嘗試過使用'findOneAndUpdate'來修正參數化集?並且:如果用戶斷開連接,更新一個布爾型字段'valid'並且保持'socketId'的原始值不變更有意義嗎? – matthias

相關問題