【问题标题】:How to update MongoDB document with mongoose如何使用 mongoose 更新 MongoDB 文档
【发布时间】:2017-01-06 03:12:27
【问题描述】:

我有一个用于 mongodb 集合的 mongoose 模式,我定义如下:

var userSchema =  new mongoose.Schema({
  username: {type: String, unique : true},
  password: {type: String},
  firstname: String,
  lastname: String,
  sketches: [{name: String, sketch: Array}]
});

var User = mongoose.model('User', userSchema);

在数据库集合中,我目前有一个包含除sketches 之外的所有属性值的文档,用于测试目的。我有一个服务器端点,当调用它时应该发出 PUT 请求来更新文档并将对象添加到草图数组:

app.route("/addSketch/:username").put(function(req, res) {
  var user_name = req.params.username;
  User.findOne({username:user_name},function(err,foundObject){
    if(err){
      console.log("error");
      res.status(500).send();
    }
    else{
      if(!foundObject){
        res.status(404).send();
      }
      else{

        if(req.body.strokes && req.body.sketchName){
          var sketchObj = [];
          sketchObj[req.body.sketchName] = req.body.strokes;
          foundObject.sketches.push(req.body.sketchData);
        }
        foundObject.save(function(err,updatedObject){
          if(err){
            console.log(err);
            res.status(500).send();
          }
          else{
            res.send(updatedObject);
          }
        });
      }
    }

  });


  console.log('saving on server');
   var form = formidable.IncomingForm();

   console.log(form);
   console.log('the type of the request received is', (typeof req));

  form.parse(req, function(err, fields, files) {
      res.writeHead(200, {"content-type": "text/plain"});
      res.write('received upload:\n\n');
    var name = fields.name;
    var newSketch = new SavedSketch();
      newSketch.name = name;
      newSketch.sketchData =  fields.value;
      newSketch.save(function(err,savedObject){
        if(err){
               console.log(err);
               res.status(500).json({status:'failure'})
            }
            else{
              console.log("ID: " + fields.value.id + " strokeData:" + fields.value.strokes);
               res.json({status: 'success'});
            } 
      });

         res.end();
  });
  });

在这个 Web 服务中,我实际上是在尝试通过用户名选择用户文档,该用户名作为参数传递给 url 字符串,如下所示:

http://localhost:11235/addSketch:testname

由于某种原因,当我尝试使用邮递员发出 PUT 请求时,我收到了 404 错误:

{"sketchName" : "tempName", "strokes":[1,2,3,4,5]}

文档本身包含以下数据:

{
    "lastname" : "name",
    "firstname" : "test",
    "password" : "password123",
    "username" : "testname",
    "_id" : ObjectId("57c4d7693aa85cea2acf4d4d"),
    "sketches" : [],
    "__v" : 0
}

网络服务本身的逻辑是否存在错误导致无法找到文档?

【问题讨论】:

    标签: node.js mongodb mongoose schema database


    【解决方案1】:

    404是Error not found,表示路由不可用。

    把你的网址改成这样:

    http://localhost:11235/addSketch/testname
    

    在此之后您将不会收到 404 错误。我希望这会有所帮助。

    编辑:解决 500 错误问题

    您在草图数组中以错误的格式推送对象。

    替换:

    var sketchObj = [];
    sketchObj[req.body.sketchName] = req.body.strokes;
    foundObject.sketches.push(req.body.sketchData);
    

    与:

    foundObject.sketches.push({"name" : req.body.sketchName,"sketch" :req.body.strokes});
    

    这应该可以解决您的 500 错误。

    【讨论】:

    • 500 错误是内部服务器错误,现在你需要检查你的路由在哪里,它会中断。在后端代码的不同点使用 console.log(),并找出它在哪个点中断。然后,如果您无法解决该错误,您可以问另一个问题。就这个问题而言,它已经解决了。
    猜你喜欢
    • 2017-09-22
    • 1970-01-01
    • 2015-10-04
    • 2016-01-22
    • 1970-01-01
    • 2016-10-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多