Сохранение мангуста без ошибок
Как видно из названия, у меня возникают проблемы с методом сохранения мангуста, который выходит из строя, но не вызывает ошибки.
Я действительно знаю, почему он терпит неудачу, а это не так, что поле 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
вызывался, но документ не менялся. Я еще не заметил основную причину (возможно, что-то вроде проверки), но проблема имела какое-то отношение к одному из изменений, которые я сделал. Поэтому я просто пробовал изменения один за другим, пока не нашел виновника.
(Не стесняйтесь редактировать этот ответ, если вы выясните больше этого явления)