mongose保存失败,没有错误
mongoose save fails without error
正如标题所示,我在mongoose保存方法方面遇到了问题,该方法失败了,但没有产生错误。
我实际上知道它失败的原因,这是因为userId字段被标记为必需的,但没有提供。。。但我不知道为什么它不抛出错误。我已经用尽了谷歌和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
很可能由于天真地没有连接到数据库而遇到此错误。已经发生在我身上好几次了。请确保你的mongoose.connect()
已经到位。
多亏了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);
}
});
}
我的问题不是通过使用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');
});
}
});
}
}
但是折扣和用户模型的模式缺少用户折扣类型的定义,所以我添加了以下内容:
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: {}
});
UserSchema.pre('save',function(next){
var currentDate=new Date();
this.updatedAt=currentDate;
if(!this.createdAt){
this.createdAt=currentDate;
};
next();
});
当我使用.pre('save',fn)
创建时间时,我忘记了next()
,导致数据存储失败,我希望能帮助到别人
对于任何可能面临类似问题的人,我发现当从实际拥有其"_id"属性(甚至设置为"null")的json对象填充mongoose模式对象时,insert会失败而不会出错。示例:
var json = JSON.parse(req.body.time);
var time = new Time(json);
假设json_id被定义,无论它被声明为新的";时间";,当您尝试插入时:
time.save(function (error) {
if (error) { res.send({'error' : error}); }
res.send(time);
});
错误variable为null,但从未插入项。在这种情况下,我通过删除"_id";属性,所以最终代码如下:
var json = JSON.parse(req.body.time);
delete json._id;
var time = new Time(json);
time.save(function (error) {
if (error) { res.send({'error' : error}); }
res.send(time);
});
问候
Angelo
与帖子中描述的场景没有直接关系,但我也收到了同样的错误。
问题是,在模型定义的pre('save')
函数结束时,我没有调用next();
。
例如:
cartSchema.pre('save', function(next) {
const currentDate = new Date();
this.modified = currentDate;
if (this.isNew) {
this.created = currentDate;
this.cartid = uuidv4();
}
next(); // this was missing :'(
});
我遇到过一种情况,调用了save
回调,但文档没有更改。我还没有找到根本原因(可能是某种验证),但问题与我所做的一项更改有关。所以我只是一个接一个地尝试改变,直到找到罪魁祸首。
(如果您了解更多这种现象,请随意编辑此答案)
- 回复'js'仅当请求有错误时(否则使用html)
- 表单已发送,但验证有错误
- 如果文件不存在,fs.watch是否有错误处理程序
- 反应错误“失败的 propType:提供给”提供者“的无效道具'子项',需要单个 ReactElement'
- 分析错误失败-What'It’他错了
- Meteor上有错误的同步问题
- 表单验证:如果有错误,不要't使手风琴动起来
- JS开放数据库有时会失败
- 我有错误文档.注册元素未被细化
- 如何转换为特定于 json 的类 c#?我有错误
- 如果当前输入有错误或警告,则禁用所有下一个表单输入字段
- 通过有错误的 Ajax-Request 打印出 HTML 会阻止进一步的 JS 工作
- 脸书应用程序有错误
- XDomainRequest 总是有错误
- HTML5 Canvas游戏有错误,点击时第一个拼图块会变成不同的块
- Page_ClientValidate返回 false,但没有一个验证器有错误
- 量角器由中继器命令中是否有错误
- Jquery 验证器 - 表单被保存但有错误
- 在Windows10通用Javascript应用程序中写入文件有时会失败
- 任何人看到我的重置功能有错误