web-dev-qa-db-fra.com

sauvegarde de mangouste échoue sans erreur

Comme le titre l'indique, j'ai des problèmes avec la méthode de sauvegarde de mangouste, qui échoue mais ne génère pas d'erreur.

Je sais en fait pourquoi cela échoue, ce qui revient au champ userId marqué comme requis mais non fourni ... mais je ne sais pas pourquoi il ne génère pas d'erreur. J'ai épuisé google et stackoverflow en regardant des suggestions similaires sans succès, alors ouvrez-les à quiconque peut m'aider!

Voici le code ...

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- Pour clarifier le rappel appelé, prenons le code suivant par exemple.

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);

});

}

et voici la sortie de la console

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
14
Jonathan Miles

Problème résolu grâce à robertkelp.

Voici mon code révisé au cas où cela aiderait jamais quelqu'un, mais il semble que l'erreur a été générée, mais je ne l'ai tout simplement pas traitée correctement.

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);
        }
    });
}
5
Jonathan Miles

Il est très possible de rencontrer cette erreur en ne se connectant pas naïvement à la base de données. M'est arrivé plusieurs fois. Assurez-vous que votre mongoose.connect() est en place.

6
Ali

Mon problème n'a pas été résolu à l'aide de findOne, il a été résolu en définissant les champs que j'ai mis à jour, dans le schéma de modèle. donc mon code était comme ça:

          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');


                        });
                    }


                });
            }
        }

Mais le schéma du modèle d’escompte et d’utilisateur manquait de la définition des types d’utilisateur.discounts, j’ai donc ajouté ce qui suit:

  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: {}
  });
3
shacharsol
UserSchema.pre('save',function(next){
  var currentDate=new Date();
  this.updatedAt=currentDate;
  if(!this.createdAt){
    this.createdAt=currentDate;
  };
  next();
});

Lorsque j'utilise la fonction .pre('save',fn) pour créer du temps, j'ai oublié la fonction next(), ce qui a provoqué la défaillance du magasin de données sans erreur , J'espère pouvoir aider quelqu'un

0
xiaopf