0

我正在尝试实现一个 PUT(更新)API 端点,将元素的主键作为路径中的参数传递,并将我想要更新的属性作为正文中的参数传递。但是没有按预期工作,而不是更新现有元素的属性,而是在数据库中创建具有错误属性的新元素。

据我从Dynamoose API 文档Model.update(key, update, options, callback)更新和表中的现有项目中了解到。例如,如果我们有一个 Dog 模型,其中age一个属性是,那么这段代码

Dog.update({ownerId: 4, name: 'Odie'}, {age: 1}, function (err) {
  if(err) { return console.log(err); }
  console.log('Just a puppy');
})

age使用 ownerId: 4 更新名为“Odie”的 Dog

现在,我尝试对自己的 API 进行类似的更新。我有一个名为的数据模型InvoiceConfig,其中主键对应于唯一的名称/id(字符串)属性,并包含另一个名为providerVariants(对象数组)的属性

这是我在 swagger 中的 API 定义:

put:
  description: Updates the invoice config matching the id (providerName)
  operationId: updateInvoiceConfigByName
  consumes:
    - application/json
  produces:
    - application/json
  parameters:
    - name: id
      in: path
      required: true
      type: string
    - name: providerVariants
      description: array of JSON objects
      in: body
      required: true
      schema:
        $ref: "#/definitions/ProviderVariantsDataList"
  responses:
    "200":
      description: A confirmation message
      schema:
        $ref: "#/definitions/ResponseMessage"
    "500":
      description: Error message
      schema:
        $ref: "#/definitions/ErrorResponse"

这是在我的代码中实现 dynamoose 更新的函数:

updateInvoiceConfigByName: function(req, res) {
   var name = req.swagger.params.id.value;
   var providerVariants = req.body;
   console.log("UPDATE /invoice-config");

   InvoiceConfig.update({provideName: name}, providerVariants, function(err) {
      if (err) {
         console.log("Update InvoiceConfig error");
         throw err;
      }

      res.status(200).send({ 
         providerName: `${name}`,
         message: 'provider invoice cfg updated'
      });
   });
}

我在数据库中有一个对象:

{
    "providerName": "ID01",
    "providerVariants": [
      {
        "displayName": "My 1st Provider ",
        "phone": "915698471",
        "availableTemplates": [
          "default"
        ]
      }
    ]
}

我尝试从 swagger-ui 传递以下参数来更新它: ID01在端点路径本身和providerVariants主体中的修改数组中:

[
   {
      "displayName": "My new name",
      "phone": "913333333",
      "availableTemplates": [
         "default"
      ]
   }
]

但是正如我一开始所说的,如果我检查我的表的内容,我会看到 providerName "ID01" 的项目没有改变,并且创建了一个新项目:

{
    "providerName": {
       "S": "[object Object]"
    }
 }

我怀疑在这个新对象中providerName(主键)填充了providerVariants数组,这是完全错误的。欢迎任何有关如何解决此问题的提示,我不知道如何进行更新。我的 API 中的其他端点(get、delete、post)工作正常,但我被 update/put 阻止了

4

1 回答 1

1

您的更新中有错字。

InvoiceConfig.update({provideName: name}, providerVariants, function(err) 

您在 providerName 中缺少 'r' :)

于 2018-01-04T19:18:45.200 回答