如果找不到ID,则使用Mongoose更新文档或插入新文档(Express REST API)

时间:2017-06-23 19:34:11

标签: node.js mongodb rest express mongoose

我已经设置了一个Express REST Api,并希望实现一个检查某个对象ID是否存在的任务。

如果Mongo数据库中存在该ID,我想使用Put请求更新此文档。本部分已在我的代码中使用。

如果数据库中尚不存在ID,我想创建一个新文档。为了做到这一点,我尝试将“upsert”选项设置为true,但是如果我现在向一个ID发出一个put请求,这个ID不在我的数据库中,但它返回错误:

throw er; // Unhandled 'error' event
  ^
CastError: Cast to ObjectId failed for value "34455ab67" at path "_id" for model "event"

以下是我的活动模型代码:

var mongoose = require('mongoose');

var eventSchema = mongoose.Schema({
   name: {
       type: String,
       required: true
   }
});
var Events = module.exports = mongoose.model('event', eventSchema, 'event');

module.exports.updateEvent = function (id, event, options, callback) {
   var query = {_id : id};
   var update = {
       name: event.name,
   };
   Events.findOneAndUpdate(query, update, options, callback);
};

这是REST API调用

app.put('/api/event/:_id', function(req, res) {           
   var id = req.params._id;
   var event = req.body;
   var options = {
       upsert: true,
       new: true,
       setDefaultsOnInsert: true
   };
   Events.updateEvent(id, event, options, function(err, event){
       if(err){
           trow err;
       }
       res.json(event);
   })
});

任何帮助都将受到高度赞赏!

1 个答案:

答案 0 :(得分:2)

发生此错误是因为您定义了没有“_id”的事件架构,因此默认情况下“_id”属性的类型变为“ObjectId”,然后当您尝试使用此值“34455ab67”mongoose方法发送“_id”时将其强制转换为“ObjectId”类型,但它是无效的字符串。所以你应该做到以下几点:

  1. 为“_id”属性发送有效的字符串值。
  2. 在将输入字符串转换为“ObjectId”之前验证输入字符串。
  3. 如果输入字符串有效,请将其转换为“ObjectId”,然后使用它 mongoose查询。
  4. 检查以下示例:

    var mongoose = require('mongoose');
    //inputId is the input string passed from the front end
    if (inputId.match(/^[0-9a-fA-F]{24}$/)) {
      // it's a valid string to be converted to "ObjectId"
      var id = mongoose.Types.ObjectId(inputId);
      //then use this id in your mongoose queries.
    } else {
      //Not valid     
    }
    

    或者您可以使用“String”类型定义“_id”以简化此过程,但这取决于您的需求。