为什么 MongoDB 在表单中的 ng-click 上给出 E11000 重复键错误

Why Does MongoDB give a E11000 duplicate key error on ng-click in a form

在使用 MEAN 堆栈时,我 运行 在尝试通过 PUT 方法更新我的数据时遇到了一些问题。

我有一个非常简单的Angular表格:

<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 和 Mongoose 的节点应用程序 (MongoDB)。我已经使用 POSTMAN 测试了 REST Api。后端一切正常。

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

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

虽然我收到此错误,但我的数据已在数据库中正确更新。问题必须来自 Angular,因为使用 POSTMAN,我所有的 HTTP 请求都没有错误地完成。我检查了我的两个请求(通过 Postman 和 Angular)是否具有相同的 headers 和 body.

知道为什么我的请求在 POSTMAN 中有效,而在我的 Angular 应用中无效吗?

通过 ngSubmit documentation I noticed that I was using ngClick AND ngSubmit in my form. This is a bad thing as explained in the 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>