本地节点API未发布到Mongoose DB

时间:2016-03-29 21:15:36

标签: angularjs node.js mongodb express mean-stack

有人可以告诉我为什么我的POST方法没有通过Mongoose保存到我的MongoDB吗?

My Angular controller

$scope.saveUpdate = function(id){
    $http.post('/api/entry/' + id)
        .success(function(data){
            $scope.entry = data;
        })
        .error(function(data){
            console.log('There was a problem saving your entry: ' + data);
        });
    // update page with remaining entries
    $http.get('/api/entries').then(function(response){
        $scope.entries = response.data;
    });
}

我的API

app.post('/api/entry/:entry_id', function(req, res){
    if (req.params) {
      Entries.findByIdAndUpdate({
        _id : req.params,
        // the properties we're updating and the new values
        username: req.body.username,
        date: req.body.date,
        income: req.body.income
      }, function(err, entry){
        if (err) {
          res.send(err) }
          else {
            res.send('Success!');
          }
      })
    }
});

视图中的提交按钮

<button type="submit" class="btn" ng-click="saveUpdate(entry._id)">Update</button>

更新的条目在单击按钮时会触及DOM,但是当它到达Angular核心代码时,它会恢复到原始状态而不更新数据库。也没有错误。

1 个答案:

答案 0 :(得分:1)

上面的代码有一些问题:

  1. 整个req.params对象传递到_id字段而不是req.params.entry_id
  2. 参数传递给findByIdAndUpdate()的方式不正确
  3. 请求正文永远不会在$http.post()中发送,但您希望req.body包含路线中的数据
  4. req.params指向请求中的整个params对象。你只想从参数中获取ID,然后将其传递给你的猫鼬模型。

    假设你正在传递entry_id,那么你将通过你的第一个条件if(req.params),因为params确实存在。但是,当您将req.params模型的_id传递到Entries字段时,您实际上是在传递整个对象{ entry_id: '123' }而不仅仅是123

    此外,您将值传递给findByIdAndUpdate方法的方式不正确。它需要4个参数findByIdAndUpdate(id, [update], [options], [callback])id是唯一必需的字段。您将传入整个对象以基于id查找并在单个参数中更新值。您需要从要更新的字段中突破entry_id

    app.post('/api/entry/:entry_id', function(req, res) {
    
      // Param Existence Checking
      if (!req.params.entry_id)
        return res.status(400).send('an entry_id must be provided');
      if (!req.body.username)
        return res.status(400).send('a username must be provided');
      if (!req.body.date)
        return res.status(400).send('a date must be provided');
      if (!req.body.income)
        return res.status(400).send('an income must be provided');
    
      var updateData = {
        username: req.body.username,
        date: req.body.date,
        income: req.body.income
      };
    
      Entries.findByIdAndUpdate(req.params.entry_id, updateData, function(err, entry){
        if (err)
          return res.status(500).send(err)
    
        return res.status(200).send('Success!');
      })
    
    });
    

    同样基于您问题的示例代码,在执行req.body时,我看不到您将值传递到$http.put()的位置。有一点可以肯定的是,如果req.body不包含usernamedateincome,则会为这些字段分配undefined

    要通过$http.post()提供请求正文,请将其传递给第二个参数data

    $http.post('/api/entry/' + id, {
      username: 'username',
      date: new Date(),
      income: 10000.00
    })
      .then(function(res, status){ 
        console.log(res.data);
      })
      .catch(function(err) {
        console.log(err);
      });
    

    此外,请勿在您的承诺链that approach is deprecated中使用.success()。在处理您的回复时,您应该使用A +标准.then().catch()