2013-11-30 4 views
14

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

Я действительно знаю, почему он терпит неудачу, что до поля 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 
+0

Похоже, [что здесь произошло] (http://stackoverflow.com/questions/10156623/mongoose-js-instance-save-callback-not-firing). – robertklep

+0

Спасибо, robert, но callback определенно вызывается, я отлаживаю и выводит на вход консоль. Я уточню вопрос, чтобы уточнить. –

+1

Вы протестировали, если 'err' на самом деле не установлен, используя что-то вроде' if (err) console.log (err) '? Кроме того, вы должны прекратить обработку остальной части кода после вызова 'handleError()' (общий метод для этого - это что-то вроде 'if (err) return handleError (...)') – robertklep

ответ

5

проблема решена, благодаря 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); 
     } 
    }); 
} 
+0

Я мог бы столкнуться с подобной проблемой, данные модели не были сохранены, но ошибка не была зафиксирована, см. Здесь [ссылка] (http://stackoverflow.com/questions/32100641/mongoose-model-data-not-saved?lq=1), для вас, какие изменения вы сделали? Я вижу, что ваша ошибка обрабатывает не большую разницу. –

+0

console.log ошибка. Для меня проблема была неправильным типом массива в моем json по сравнению с схемой. то есть моя схема ожидала Schema.ObjectId, и я поставлял целочисленный список –

5

Очень возможно выполнить эту ошибку наивно, не подключаясь к базе данных. Случилось несколько раз со мной. Удостоверьтесь, что ваш 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.discounts так я добавил следующее:

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: {} 
    }); 
-2

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

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

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

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

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