Сохранение мангуста без ошибок

Как видно из названия, у меня возникают проблемы с методом сохранения мангуста, который выходит из строя, но не вызывает ошибки.

Я действительно знаю, почему он терпит неудачу, а это не так, что поле userId помечено как необходимо, но не предоставляется... но я не знаю, почему он не выдает ошибку. Я исчерпал google и stackoverflow, глядя на подобные предложения, не повезло, поэтому бросать его всем, кто может мне помочь!

Здесь код...

Model.js

var mongoose = require('mongoose');

var TimeSchema = new mongoose.Schema({
    client: String,
    matter: String,
    activity: String,
    tags: String,
    description: String,
    comments: [String],
    startTime: Date,
    startTimeUTC: Number,
    endTime: Date,
    endTimeUTC: Number,
    duration: Number, 
    durationRnd: Number,    
    durationUnits: Number,  
    billable: Boolean,
    rate: Number,
    total: Number,
    user: String,
    userId: { type: mongoose.Schema.ObjectId, required: true }
}, {safe: true});

mongoose.model("Time", TimeSchema);


Controller.js

exports.addTime = function (req, res) {

    console.log('Adding time: ' + JSON.stringify(req.body));
    var time = new Time(req.body);
    time.save(function (err) {
        if (err) { res.send({'error' : err}); }
        res.send(time);
    });
}

EDIT. Чтобы уточнить обратный вызов, вызывается, например, следующий код.

exports.addTime = function (req, res) {

    console.log('Adding time: ' + JSON.stringify(req.body));
    var time = new Time(req.body);
    console.log("time = " + time);
    // TODO user
    time.save(function (err) {
        if (err) { handleError(res, err); }
        console.log("ok");
        Time.findById(time._id, function (err, found) {
            console.log("found = " + found);
        });
        res.send(time);

});

}

и здесь консольный вывод

Adding time: {"description":"test","client":"","matter":"","activity":"","rate":
"","startTime":"2013-11-30T19:58:43.000Z","startTimeUTC":"1385841523000","endTim
e":"2013-11-30T19:58:45.000Z","endTimeUTC":"1385841525000","startLocale":"19:58"
,"startTimeLocale":"19:58:43","endLocale":"19:58","endTimeLocale":"19:58:45"}
time = { description: 'test',
  client: '',
  matter: '',
  activity: '',
  rate: null,
  startTime: Sat Nov 30 2013 19:58:43 GMT+0000 (GMT Standard Time),
  startTimeUTC: 1385841523000,
  endTime: Sat Nov 30 2013 19:58:45 GMT+0000 (GMT Standard Time),
  endTimeUTC: 1385841525000,
  startTimeLocale: '19:58:43',
  endTimeLocale: '19:58:45',
  _id: 529a43750a366b6419000001,
  comments: [] }
ok
POST /api/times 200 14ms - 313b
found = null

Ответы

Ответ 1

Проблема решена, благодаря robertkelp.

Здесь мой пересмотренный код в случае, если когда-либо помогает кому-либо, но кажется, что была ошибка, я просто не обрабатывал ее правильно.

exports.addTime = function (req, res) {

    console.log('Adding time: ' + JSON.stringify(req.body));
    var time = new Time(req.body);
    time.save(function (err) {
        if (err) { 
            handleError(res, err);
        }
        else {
            res.send(time);
        }
    });
}

Ответ 2

Очень возможно выполнить эту ошибку, наивно не подключаясь к базе данных. Случилось несколько раз со мной. Убедитесь, что ваш mongoose.connect() находится на месте.

Ответ 3

Моя проблема не была решена с помощью findOne, она была решена путем определения обновленных полей я в схеме модели. поэтому мой код был таким:

          User.findOne({email:data.userData.email}, function (err, user) {
                    if (!err && user!=undefined){
                        console.log(user);
                        var userDiscounts = user.discounts;
                        for(var i=0;i<userDiscounts.length;i++){

                            if (userDiscounts[i]!=undefined && userDiscounts[i].code=="XXXXXX"){
                                userDiscounts[i].claimed = true;

                                console.log('discount claimed');

                            }
                        }
                        user.discounts = userDiscounts;
                        user.fbDiscountClaimed = true;
                        user.save(function(err) {
                            if (err) console.log(err);
                            console.log('Saved Hashve-FB as claimed');


                        });
                    }


                });
            }
        }

Но в схеме дисконтной и пользовательской модели отсутствовало определение типов user.discount, поэтому я добавил следующее:

  var UserSchema = new Schema({
  name: String,
  email: { type: String, lowercase: true },
   role: {
   type: String,
   default: 'user'
 },
  hashedPassword: String,
  provider: String,
  salt: String,
  messages:[],
  discounts:[{
  "name": String,
  "description": String,
  "created_at": String,
  "updated_at": String,
  "code": String,
  "claimed": Boolean
    }
    ],
   facebook: {},
   fbDiscountClaimed:false,
    twitter: {},
  google: {},
  github: {}
  });

Ответ 4

UserSchema.pre('save',function(next){
  var currentDate=new Date();
  this.updatedAt=currentDate;
  if(!this.createdAt){
    this.createdAt=currentDate;
  };
  next();
});

Когда я использую .pre('save',fn) для создания времени, я забыл next(), в результате чего хранилище данных завершилось без ошибок, я надеюсь, что это поможет кому-то!

Ответ 5

У меня была ситуация, когда вызываемый вызов save вызывался, но документ не менялся. Я еще не заметил основную причину (возможно, что-то вроде проверки), но проблема имела какое-то отношение к одному из изменений, которые я сделал. Поэтому я просто пробовал изменения один за другим, пока не нашел виновника.

(Не стесняйтесь редактировать этот ответ, если вы выясните больше этого явления)