簡體   English   中英

UnknownType 類型的驗證錯誤:未知類型 CreateUserInput

[英]Validation error of type UnknownType: Unknown type CreateUserInput

使用 AppSync Query Playground 運行此查詢。

mutation UserMutation ($input: CreateUserInput!) {
    createUser
      (input: $input) 
      {
          uniqueID
          recordType
          userName
          userEmail
          userEmailVerified
          userCreated
          userLastModified
          userEnabled
          userStatus
          userValidFrom
          userValidTo
      }
    }

查詢變量是

{
  "input":  
  {
      "uniqueID": "UUID-formatted",
      "recordType": "USER",
      "userName": "username",
      "userEmail": "mailadres",
      "userEmailVerified": true,
      "userCreated": "2020-12-04T22:32:37.000Z",
      "userLastModified": "2020-12-04T22:34:15.000Z",
      "userEnabled": true,
      "userStatus": "CONFIRMED",
      "userValidFrom": "2021-03-12T11:03:37.283Z",
      "userValidTo": "9999-12-31T23:59:59.999Z"
  }
}

按預期在 DynamoDB 表中創建一條記錄。

這向我表明 model 和解析器在 AppSync 中得到了很好的定義。

在 NodeJS Express 環境中運行完全相同的代碼會產生上述錯誤。

API-key 和 GraphQL 端點是正確的。 使用和工作的其他實體的方法完全相同。

這是 NodeJS 代碼

exports.userCreate = (cognitosub, userName, cognitoemail, cognitoemail_verified, cognitoUserCreateDate, cognitoUserLastModifiedDate, cognitoEnabled, cognitoUserStatus, userValidFrom, userValidTo) => {
  const mutateQuery = gql(`
  mutation UserMutation ($input: CreateUserInput!) {
    createUser
      (input: $input) 
      {
          uniqueID
          recordType
          userName
          userEmail
          userEmailVerified
          userCreated
          userLastModified
          userEnabled
          userStatus
          userValidFrom
          userValidTo
      }
    }
  `);
  const mutateVariables = JSON.parse(`{
    "uniqueID" : "${cognitosub}",
    "recordType" : "USER",
    "userName" : "${userName}",
    "userEmail" : "${cognitoemail}",
    "userEmailVerified" : ${cognitoemail_verified},
    "userCreated" : "${cognitoUserCreateDate}",
    "userLastModified" : "${cognitoUserLastModifiedDate}",
    "userEnabled" : ${cognitoEnabled},
    "userStatus" : "${cognitoUserStatus}",
    "userValidFrom" : "${utils.dateConvertToISOString(userValidFrom)}",
    "userValidTo" : "${utils.dateConvertToISOString(userValidTo)}"
  }`)
  return new Promise ((resolve, reject) => {
    console.debug(`${Date(Date.now())} - utilities.userCreate.mutateVariables`,mutateVariables)
    graphqlClient.mutate({
      mutation: mutateQuery, 
      fetchPolicy: 'no-cache', // Mutate suporteert alleen 'no-cache'
      variables: {input: mutateVariables}
    })
      .then((success) => {
        // console.debug(`${Date(Date.now())} - utilities.userCreate.then`,success)
        if (success === null) {reject('userIsNull')}
        else {
          resolve(success.data.createUser.uniqueID)}
      })
      .catch((err) => {
        console.debug(`${Date(Date.now())} - utilities.userCreate.catch\n`,err)
        reject(err)
      })
  })

完全相同的代碼用於不太復雜的 object,其 UUID、標識、validFrom 和 ValidTo 日期。 它就像一個魅力。

我查看了每個錯誤和拼寫錯誤。 代碼不斷拋出這兩個錯誤。

graphQLErrors: [
    {
      path: null,
      locations: [ { line: 1, column: 31, sourceName: null } ],
      message: 'Validation error of type UnknownType: Unknown type CreateUserInput'
    },
    {
      path: null,
      locations: [ { line: 2, column: 3, sourceName: null } ],
      message: "Validation error of type FieldUndefined: Field 'createUser' in type 'Mutation' is undefined @ 'createUser'"
    }
  ]

哪些是錯誤對象的轉儲。

Appolo-client 用於訪問 DynamoDB。 在 AppSync GraphQL Playground 中創建的記錄可以在數據庫中完美查看。

我這里沒有線索。 任何人都可以幫忙嗎?

今天我真的研究了這個問題,並決定不再使用 AWS 的 AppSync 客戶端(順便說一下,每次 npm 更新都會產生一些依賴構建問題......)我選擇 go 用於 Apollo 客戶端最新版本提供任何 npm 更新問題,如果我了解情況,它是 AWS 在后台使用的客戶端的最新版本(閱讀可以很好地閱讀論壇;-))

我在 AppSync 上的身份驗證方面遇到了一些問題,但設法克服了這個問題。

這段代碼完全修復了所有以前的錯誤(對我來說)

const gql = require("graphql-tag"); 
const ApolloClient = require("@apollo/client").ApolloClient
const ApolloLink = require("@apollo/client").ApolloLink
const InMemoryCache = require("@apollo/client").InMemoryCache;
const createHttpLink = require("@apollo/client").createHttpLink;
const {createAuthLink} = require("aws-appsync-auth-link")
require('cross-fetch/polyfill');

const clientGraphQL = new ApolloClient({
  link: ApolloLink.from([
    createAuthLink({ 
      url: aws_secrets.AWS_DEV_APPSYNC_ENDPOINT, 
      region:aws_secrets.REGION, 
      auth:
        {
          type: "API_KEY",
          apiKey: aws_secrets.AWS_DEV_APPSYNC_API_KEY,
        } 
    }),
    createHttpLink({ 
      uri: aws_secrets.AWS_DEV_APPSYNC_ENDPOINT 
    }),
  ]),
  cache: new InMemoryCache(),
});

通過將所有秘密隱藏在特殊文件中來保護代碼。 createAuthLink 是我唯一需要 AWSAppSync (恕我直言)的東西。 我沒有設法從 Apollo 客戶端獲得與 CreateAuthLink 的正確連接。

希望這對你們中的一些人有所幫助...

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM