【问题标题】:Error: Can't set headers after they are sent. Node Expressjs错误:发送后无法设置标头。节点 Expressjs
【发布时间】:2016-07-16 10:43:21
【问题描述】:

我已经阅读了一些关于同一问题的问题,但没有一个适用于我的个人案例。我正在尝试从 ng-repeat 列表中删除一个条目。

这是我的观点(ng-shows 用于编辑目的):

<tr ng-repeat="entry in entries" ng-cloak>
    <th>{{ $index + 1 }}</th>
    <td>
        <span ng-show="!editMode[$index]">{{ entry.username }}</span>
        <input ng-show="editMode[$index]" type="text" ng-model="entry.username"/>
    </td>
    <td>
        <span ng-show="!editMode[$index]">{{ entry.date }}</span>
        <input ng-show="editMode[$index]" value="{{entry.date}}"/>
    </td>
    <td>
        <span ng-show="!editMode[$index]">{{ entry.hours }}</span>
        <input ng-show="editMode[$index]" type="text" ng-model="entry.hours"/>
    </td>
    <td>
        <span ng-show="!editMode[$index]">{{ entry.payout }}</span>
        <input ng-show="editMode[$index]" type="text" ng-model="entry.payout"/>
    </td>
    <td>
        <button ng-show="!editMode[$index]" type="submit" class="btn btn-primary" ng-click="deleteEntry($index)">Delete</button>
        <button ng-show="!editMode[$index]" type="submit" class="btn btn-primary" ng-click="editEntry($index)">Edit</button>

        <button ng-show="editMode[$index]" type="submit" class="btn btn-primary" ng-click="saveUpdate($index)">Update</button>
        <button ng-show="editMode[$index]" type="submit" class="btn btn-primary" ng-click="cancelUpdate($index)">Cancel</button>

    </td>
</tr>

我的角度控制器:

// DELETE
$scope.deleteEntry = function(id) {
// delete entry from DB using clicked listing's id
$http.delete('/api/entry/' + id)
  .success(function(data) {
      $scope.entry = data;
  })
  .error(function(data) {
      console.log('Error: ' + data);
  });
// then update page with remaining entries
$http.get('/api/entries').then(function(response){
        $scope.entries = response.data;
    });
};

在我的 apiController.js 中

app.delete('/api/entry/:entry_id', function(req, res){           
  Entries.remove({
    _id : req.params.entry_id
  }, function(err, entry) 
    if (err)
      res.send(err);

    // get and return remaining entries
    Entries.find(function(err, entries) {
      if (err)
      res.send(err)
      res.json(entries);
    });
  });
});

当我删除 Entries.find 函数时,错误消失但删除调用不再起作用。

我正在使用 mongoose 连接到我的数据库。

我在这里缺少什么?

【问题讨论】:

  • 条目 ID 是否已从数据库中删除?删除 id 或查找条目时可能会引发错误。
  • @DhananjayaKuppu,不,该条目没有从数据库中删除。这是更大的问题。

标签: angularjs node.js mean-stack


【解决方案1】:

把它放在if else 条件下。发送响应后,它会继续并尝试再次发送,这会导致此异常。

app.delete('/api/entry/:entry_id', function(req, res){           
  Entries.remove({
_id : req.params.entry_id
 }, function(err, entry) 
if (err)
  res.send(err);

else{
Entries.find(function(err, entries) {
  if (err)
  res.send(err) 
 else
  res.json(entries);
});
}
  });
});

【讨论】:

    【解决方案2】:

    您的代码将错误响应发送回客户端,然后它会立即尝试发送 JSON 响应。第一个响应结束请求/响应过程,意味着无法再发送第二个响应并抛出 can't set headers after they are sent 错误。

    为了解决这个问题,我在错误处理中总是return early。这结束了请求/响应循环,然后从函数返回,这样后面的代码都不会被执行。

    if (err) return res.send(err);
    res.json(entries)
    

    【讨论】:

      【解决方案3】:

      两个响应在同一个 If 块中返回,所以标题冲突.....

          app.delete('/api/entry/:entry_id', function(req, res){              
      
             Entries.remove({_id : req.params.entry_id},
            function(err, entry) 
              if (err){
                res.send(err);
               }     //end if block
              else{
              // get and return remaining entries
              Entries.find(function(err, entries) {
                if (err){
                res.send(err)
                } 
              else{
                res.json(entries);
                 }
              });
      
          }  //end else block
       }); 
      
      });
      

      【讨论】:

      • 这实际上解决了错误,所以我将它标记为正确答案,但不幸的是现在我的删除方法不起作用!这可能是一个不同的问题。
      • 更新:这是一个不同的问题。工作中。感谢您的帮助!
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-07-05
      相关资源
      最近更新 更多