mongoose保存失败但没有错误提示

16
正如标题所示,我在使用mongoose的save方法时遇到问题,它失败了但没有产生错误。
实际上我知道为什么失败了,这是由于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);
    });
}

编辑 - 为了澄清回调正在被调用,以以下代码为例。

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
听起来像是发生了什么事情(https://dev59.com/EGkw5IYBdhLWcg3wE2dA)。 - robertklep
谢谢Robert,但回调函数确实被调用了,我已经进行了调试并输出了控制台日志。我会更新问题以澄清。 - Jon Miles
1
你测试过 err 是否未被设置,例如使用 if (err) console.log(err) 这样的方式吗?另外,在调用 handleError() 后,应该停止执行代码的其余部分(通常的做法是使用类似 if (err) return handleError(...) 的方法)。 - robertklep
谢谢Robert,你刚刚帮我解决了问题,你说得对...错误就在那里,只是我没有正确处理它。我在前端使用了backbone marionette,它会将模型添加到前端,可能是由于我的错误处理方式不当。我需要单独研究一下这个问题。 - Jon Miles
7个回答

7

如果没有正确连接到数据库,很可能会遇到这个错误。我曾经也遇到过几次。请确保你的mongoose.connect()已经就位。


6
问题解决了,感谢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);
        }
    });
}

我可能会遇到类似的问题,即模型数据未保存但没有捕获错误,请参考此处链接。对于你的情况,你做了哪些更改?我看到你的错误处理并没有太大的区别。 - Derrick.X
控制台打印错误。对我而言,问题是我的JSON数组类型与模式不匹配,即我的模式期望的是Schema.ObjectId,而我提供的是整数列表。 - Saad Farooq

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


                        });
                    }


                });
            }
        }

但是折扣和用户模型的架构缺少用户优惠类型的定义,因此我添加了以下内容:

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

0

虽然与帖子中描述的情况没有直接关系,但我遇到了同样的错误。

问题在于我没有在模型定义的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 :'(
  
});

0

对于任何人可能遇到的类似问题,我发现当从一个拥有其“_id”属性(即使设置为“null”)的JSON对象中填充mongoose模式对象时,插入操作会失败而没有错误信息。 例如:

var json = JSON.parse(req.body.time);
var time = new Time(json);

假设已经定义了 json._id,无论它是否声明为新的 "Time",当您尝试插入时:
time.save(function (error) {
    if (error) { res.send({'error' : error}); }
    res.send(time);
});

错误:变量为空,但是项目从未被插入。在这种情况下,我通过在填充mongoose对象之前删除“_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);
});

敬礼

安吉洛


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

当我使用.pre('save',fn)创建时间时,我忘记了next(),导致数据存储失败而没有错误提示,希望能帮到有需要的人!

-3
我遇到了一个情况,其中`save`回调被调用了,但是文档并没有发生变化。我还没有追查出根本原因(可能是某种验证问题),但这个问题与我所做的更改之一有关。因此,我只是逐个尝试了这些更改,直到找到罪魁祸首。
(如果您找到了更多相关信息,请随意编辑此答案)

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接