2015-07-20 62 views
1

使用MEAN堆栈时,遇到了一些问题,试图通过PUT方法更新我的数据。为什么MongoDB在表单中以ng-click的形式发出E11000重复密钥错误

我有一个非常简单的角形式:

<form ng-submit="vm.createQuote()"> 
    <label>Author</label> 
    <input type="text" ng-model="vm.quote.author"> 

    <label>Text</label> 
    <textarea cols="30" rows="4" ng-model="vm.quote.text"></textarea> 

    <button type="submit">CREATE</button> 
    <button ng-click="vm.updateQuote()">UPDATE</button> 
</form> 

我使用Express和猫鼬(MongoDB的)一个节点应用。我使用POSTMAN测试了REST Api。一切工作正常在后端。

当我尝试使用表单更新按钮更新某个报价(触发$ http.put),我得到一个MongoDB的错误:

MongoError: E11000 duplicate key error index: mydb.quotes.$_id_ dup key: { : ObjectId('55acecfcee620c7a04e9641c') } 

虽然我得到这个错误,我的数据是正确更新在DB中。这个问题必须来自Angular,因为通过POSTMAN,我的所有HTTP请求都可以完成而不会出错。我检查了我的请求(通过Postman & Angular)具有相同的标题和正文。

任何想法为什么我的请求在POSTMAN中工作,而不是在我的Angular应用程序中?

+0

你发送对象与ID?例如,您是使用现有对象填充表单,然后尝试使用修改后的数据插入相同的对象?如果是这样会导致ID冲突 –

+0

是的,显然表单元素正在发送包含已存在ID的对象的POST。 –

回答

0

虽然经历了ngSubmit documentation,但我注意到我在表单中使用了ngClick和ngSubmit。在angular form documentation中解释这是一件坏事。

显然,当我触发更新时,PUT请求正常发生(这就是为什么我的数据正确更新)。但是因为我使用的是ngSubmit和ngClick,表单元素本身也在执行一个POST请求,这会导致MongoDB错误。

MongoDB错误被抛出的原因是因为POST请求正在使用来自PUT请求的响应主体作为它自己的主体。 这会导致重复键错误,因为正文中的对象具有已存在于数据库中的ID。

的固定形式:

<form> 
    <label>Author</label> 
    <input type="text" ng-model="vm.quote.author"> 

    <label>Text</label> 
    <textarea cols="30" rows="4" ng-model="vm.quote.text"></textarea> 

    <button ng-click="vm.createQuote()">CREATE</button> 
    <button ng-click="vm.updateQuote()">UPDATE</button> 
</form> 
相关问题