2016-03-01 72 views
4

我與貓鼬和MongoDB貓鼬實例.save()不工作

問題

這是非常有趣的是,只有Model.update作品和save永遠不會奏效甚至不火的回調。

貓鼬:4.4.5 的MongoDB:3.0.8

快速通道

var mongoose = require('mongoose'); 
mongoose.connect("mongodb://127.0.0.1:27017/db"); 
var db = mongoose.connection; 
db.on('error', console.error.bind(console, 'connection error:')); 
db.once('open', function(callback) { 
    console.log("connection to db open") 
}); 
var User = require("../models/user.js"); 

用戶模型

var user = new Schema({ 
    uid: { type: Number, required: true, unique: true}, 
    hwid: { type: String, default:""}, 
    bol:{type:String,default:""} 
}); 

更新Enpoint

工作版本:Model.update()

User.update({_id: id}, { 
    uid: 5, 
}, function(err, numberAffected, rawResponse) { 
    console.log(err); 
}) 

不工作的版本,我必須解決這個問題:Object.save()

User.find({_id:id}, function(err,user){ 
    if(err){ 
     console.log(err); 
    } 
    if(!user){ 
     console.log("No user"); 
    }else{ 
     user.uid = 5; 
     user.save(function(err,news){ 
      console.log("Tried to save..."); 
     }); 
    } 
    console.log("At least worked"); 
}) 

即使回調沒有觸發。連接成功打開。它從不調用回調。


  1. 儘量選用var User = connection.model('User', schema)沒有工作。
+0

我知道你的評論說這是一個mongo對象,但說實話,你沒有證明這一點,這是你的'.save'方法沒有被激發的最可能的原因。你如何驗證它是從DB返回的實際實例? – Paul

+0

@Paul爲你更新的問題 –

+0

當''.find()'回調函數中的console.log'user'出現什麼情況? –

回答

8

我不會刪除這個問題,因爲人們也可能會遇到這個問題。其實問題與MongoDb或Mongoose無關。當您嘗試Object.save()要調用系統運行像

  1. Schema.pre( 「拯救」)
  2. 保存數據DABE
  3. Schema.post( 「拯救」)

所以,如果你阻止你的預先(「保存」),並且不會調用下一個回調,你將無法保存。這是我的情況,我忘了if。並試圖找到超過3個小時的錯誤。如果this.trial == true,下一個回調將不可達。

這是一個耗時的錯誤,因爲您正在儘可能快地工作,編輯架構對您而言不會有任何危險。請小心將if添加到pre事件中。

修正版本

user.pre("save", function(next) { 
    if(!this.trial){ 
     //do your job here 
    } 
    next(); 
} 
+5

我們是否可以在這裏注意,因爲你的問題本身沒有提到「預存鉤子」,那麼這不是任何人都會得到的解決方案。當然,如果中間件延續沒有被調用,那麼代碼就會卡住而不能繼續。這些實際上是「回調」而不是承諾。 –

2

就像保羅說的那樣。很可能你要調用保存在'req.user'對象上,它不是一個Mongoose對象。確保你正在做這樣的事情:

//I am using your 'user' schema 
var userModel = mongoose.model('User', user); 
var User = mongoose.model('User'); 
var newUser = new User(req.user); 
newUser.save(function(error, user){ 
    //your code 
} 
+0

沒有這不起作用,我相信.save() –

+0

有什麼問題謝謝你的幫助,自己解決了這個問題。犯了一個新錯誤。 –

0

萬一發生這種情況給任何人。

這可能的另一個原因可能是,如果你沒有開放的連接到你的mongodb實例。檢查你的輸出是否有適當的連接反饋。

[initandlisten]連接(現已開放1連接)從127.0.0.1:40448#1接受

1

這聽起來堅果..我一直在試圖通過這個問題來工作了幾個小時。看着這麼多的堆棧溢出帖子,這是令人難以置信的。

你知道它是什麼嗎?我沒有在網址的末尾指定數據庫。

所以不是

"mongodb://127.0.0.1:27017/test" 

"mongodb://127.0.0.1:27017 

我浪費了一整天這一點。我真的希望我有某種錯誤。保存記錄總是返回正常。而在數據庫日誌中,我連接正常。但我真的需要看細節。是的,它連接到mongo實例,但不連接到數據庫本身。啊!