【问题标题】:mongoose save fails without error猫鼬保存失败且没有错误
【发布时间】:2013-12-16 18:39:28
【问题描述】:

正如标题所示,我在使用 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

【问题讨论】:

  • 听起来像what's happened here
  • 谢谢罗伯特,但肯定会调用回调,我已经调试过并且正在控制台上记录输出。我会更新问题以澄清。
  • 您是否测试过err 是否实际上没有使用if (err) console.log(err) 之类的东西设置?此外,您应该在调用handleError() 后停止处理其余代码(这样做的常用方法类似于if (err) return handleError(...)
  • 谢谢罗伯特,你刚刚帮我解决了这个问题,你发现了......错误就在那里,我只是没有正确处理它。我在前端有骨干木偶,它只是添加了模型前端,也许是我的错误处理。我需要单独调查。

标签: javascript node.js mongoose


【解决方案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);
        }
    });
}

【讨论】:

  • 我可能会遇到类似的问题,模型数据未保存但未捕获错误,请参阅此处link,对于您的情况,您做了哪些更改?我看到你的错误处理没有太大区别
  • console.log 错误。对我来说,与模式相比,我的 json 中的数组类型错误。即我的架构需要一个 Schema.ObjectId 并且我提供了一个整数列表
【解决方案2】:

天真地没有连接到数据库很可能会遇到这个错误。在我身上发生了好几次。确保您的mongoose.connect() 已就位。

【讨论】:

    【解决方案3】:

    我的问题没有通过使用 findOne 解决,而是通过在模型模式中定义字段 i updated 来解决。所以我的代码是这样的:

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

    【讨论】:

      【解决方案4】:

      我遇到了一种情况,即调用了 save 回调,但文档没有更改。我还没有找到根本原因(可能是某种验证),但问题与我所做的一项更改有关。所以我只是一一尝试改变,直到找到罪魁祸首。

      (如果您发现更多这种现象,请随时编辑此答案)

      【讨论】:

        【解决方案5】:
        UserSchema.pre('save',function(next){
          var currentDate=new Date();
          this.updatedAt=currentDate;
          if(!this.createdAt){
            this.createdAt=currentDate;
          };
          next();
        });
        

        使用.pre('save',fn)创建的时候,忘记next(),导致数据存储失败,不报错,希望对大家有所帮助!

        【讨论】:

          【解决方案6】:

          对于任何人都可能面临类似问题,我发现当从实际拥有其“_id”属性(甚至设置为“null”)的 json 对象填充 mongoose 模式对象时,插入失败且没有错误。 示例:

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

          error 变量为空,但从未插入过项目。 在这种情况下,我通过在填充 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);
          });
          

          问候

          安杰洛

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 2013-01-17
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2012-10-08
            相关资源
            最近更新 更多