MongoDB Stitch GraphQL 自定义突变解析器返回 null

MongoDB Stitch GraphQL Custom Mutation Resolver returning null

GraphQL 是 MongoDB Stitch 的新功能,我知道它处于测试阶段,因此提前感谢您的帮助。我很高兴直接在 Stitch 中使用 GraphQL,所以我希望我可能只是忽略了一些东西。

return Payload 的 documentation 显示了 bsonType 的使用,但是当实际输入 JSON 有效负载类型的架构时,它要求您使用 "type" 而不是 "bsonType"。它仍然可以使用 "bsonType" 对我来说这很奇怪,只要至少有一个属性使用 "type".

函数如下:

      const mongodb = context.services.get("mongodb-atlas");
      const collection = mongodb.db("<database>").collection("<collection>");
      const query = { _id: BSON.ObjectId(input.id) }
      const update = {
        "$push": {
          "notes": {
            "createdBy": context.user.id, 
            "createdAt": new Date, 
            "text": input.text
          }
        }
      };

      const options = { returnNewDocument: true }

      collection.findOneAndUpdate(query, update, options).then(updatedDocument => {
        if(updatedDocument) {
      console.log(`Successfully updated document: ${updatedDocument}.`)
    } else {
      console.log("No document matches the provided query.")
    }
    return {
      _id: updatedDocument._id,
      notes: updatedDocument.notes
    }
  })
  .catch(err => console.error(`Failed to find and update document: ${err}`))
}

这是客户解析器中的输入类型:

  "type": "object",
  "title": "AddNoteToLeadInput",
  "required": [
    "id",
    "text"
  ],
  "properties": {
    "id": {
      "type": "string"
    },
    "text": {
      "type": "string"
    }
  }
}

以下是负载类型:

{
  "type": "object",
  "title": "AddNoteToLeadPayload",
  "properties": {
    "_id": {
      "type": "objectId"
    },
    "notes": {
      "type": "array",
      "items": {
        "type": "object",
        "properties": {
          "createdAt": {
            "type": "string"
          },
          "createdBy": {
            "type": "string"
          },
          "text": {
            "type": "string"
          }
        }
      }
    }
  }
}

输入错误时 "type" 错误状态:

Expected valid values are:[array boolean integer number null object string]

输入错误时 "bsonType" 错误状态:

Expected valid values are:[string object array objectId boolean bool null regex date timestamp int long decimal double number binData]

我已经尝试了所有我能想到的组合,包括将所有 "bsonType" 更改为 "type"。我还尝试在使用 "type" 时将 _id 更改为字符串,或在 "bsonType" 时将 objectId 更改为字符串。无论我在使用突变时尝试什么组合,它都会按照预期的方式将注释添加到前导中,但 return 有效负载始终显示为空。我需要它 return _id 并注意它会在前端更新 Apollo 中的 InMemoryCache。

您好 Bernard – 目前自定义解析器表单 UI 中存在一个不幸的错误,它不允许您仅在 input/payload 类型中使用 bsonType – 我们正在努力解决这个。实际上,只要它们与您的数据一致,您就应该能够使用 type/bsonType 或两者的混合。我认为你想要的负载类型定义很可能是:

{
  "type": "object",
  "title": "AddNoteToLeadPayload",
  "properties": {
    "_id": {
      "bsonType": "objectId"
    },
    "notes": {
      "type": "array",
      "items": {
        "type": "object",
        "properties": {
          "createdAt": {
            "bsonType": "date"
          },
          "createdBy": {
            "type": "string"
          },
          "text": {
            "type": "string"
          }
        }
      }
    }
  }
}

如果这不起作用,向我们提供您希望返回的数据示例可能会有所帮助。

我注意到您在致电 collection.findOneAndUpdate()

之前可能漏掉了一个 return

我尝试了这个函数(与你的类似)并将 GraphiQL 设置为 return 值(所有输入和有效负载类型都为 String

exports = function(input){

  const mongodb = context.services.get("mongodb-atlas");
      const collection = mongodb.db("todo").collection("dreams");
      const query = { _id: input.id }
      const update = {
        "$push": {
          "notes": {
            "createdBy": context.user.id, 
            "createdAt": "6/10/10/10",
            "text": input.text
          }
        }
      };

      const options = { returnNewDocument: true }

return collection.findOneAndUpdate(query, update, options).then(updatedDocument => {
        if(updatedDocument) {
      console.log(`Successfully updated document: ${updatedDocument}.`)
    } else {
      console.log("No document matches the provided query.")
    }
    return {
      _id: updatedDocument._id,
      notes: updatedDocument.notes
    }

  })
  .catch(err => console.error(`Failed to find and update document: ${err}`))
}