2016-03-01 4 views
4

У меня есть проблема с Мангуста и MongoDbMongoose экземпляр .save() не работает

Очень интересно, что только Model.update работы и save никогда не работает и даже не огонь обратного вызова.

Mongoose: 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:""} 
}); 

Update 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

Я знаю, что в вашем комментарии говорится, что это объект монго, но, честно говоря, в доказательстве этого нет ничего, и это самая вероятная причина, по которой ваш метод '.save' не срабатывает. Как вы проверяете, что это фактический экземпляр, возвращенный из БД? – Paul

+0

@Paul Обновленный вопрос для вас –

+0

Что происходит, когда вы console.log 'user' внутри обратного вызова' .find() '? –

ответ

8

Я не собираюсь удалить этот вопрос, потому что люди могут столкнуться с этой проблемой. На самом деле проблема не связана с MongoDb или Mongoose. При попытке Object.save() Вы вызываете система работает как

  1. Schema.pre ("сохранить")
  2. Сохранить данные в Dabe
  3. Schema.post ("сохранить")

Итак, если вы заблокируете предварительный («сохранить») и не вызываете следующий обратный вызов, вы не сможете сохранить. Это мой случай, я забыл if. И попытался найти ошибку более 3 часов.

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

Что делать, если this.trial == true, следующий обратный вызов не будет доступен.

Это трудоемкая ошибка, потому что вы работаете так быстро, как можете, и редактирование схемы не может быть опасно для вас.Позаботьтесь о добавлении if к вашим pre событиям.

Fixed Version

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

Можем ли мы быть реалистичными здесь и отметить, что, поскольку ваш вопрос сам не упоминает об «предварительном резервном крючке», то это на самом деле не решение, к которому каждый должен был прийти. Да, конечно, если продолжение промежуточного ПО не было вызвано, тогда код просто застрянет и не продолжится. И это на самом деле «обратные вызовы», а не обещания. –

2

Как сказал Пол. Скорее всего, вы вызываете save на объект 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] соединение принимается от 127.0.0.1:40448 # 1 (1 подключение теперь открыт)

1

Это звучит орехи .. и я пытался работать через эту проблему в течение нескольких часов. Посмотрел на столько стоп-стопок. Это невероятно.

И вы знаете, что это было? Я не указывал базу данных в конце URL-адреса.

Таким образом, вместо

"mongodb://127.0.0.1:27017/test" 

Я имел

"mongodb://127.0.0.1:27017 

Я потратил целый день на это. Мне очень жаль, что мне не дали какие-то ошибки. Сохранение записи всегда возвращалось нормально. И в журнале базы данных я подключался нормально. Но мне действительно нужно было посмотреть на детали. Да, он подключался к экземпляру mongo, но не к самой базе данных. тьфу!

Смежные вопросы