将AWS Appsync Graphql链接连接为Gatsbyjs数据源

将AWS Appsync Graphql链接连接为Gatsbyjs数据源,graphql,apollo,gatsby,aws-appsync,graphql-tools,Graphql,Apollo,Gatsby,Aws Appsync,Graphql Tools,正在使用IAM auth设置一个GatsbyJS插件,该插件来自AWS AppSync。我不断遇到一个错误,我无法找到问题所在 我对graphql链接没有太多的经验,也找不到关于如何在这种情况下做好这项工作的好文档 这就是我的插件gatsby-node.js文件的样子: const uuidv4 = require(`uuid/v4`) const invariant = require(`invariant`) const fetch = require(`node-fetch`) const

正在使用IAM auth设置一个GatsbyJS插件,该插件来自AWS AppSync。我不断遇到一个错误,我无法找到问题所在

我对graphql链接没有太多的经验,也找不到关于如何在这种情况下做好这项工作的好文档

这就是我的插件gatsby-node.js文件的样子:

const uuidv4 = require(`uuid/v4`)
const invariant = require(`invariant`)
const fetch = require(`node-fetch`)
const { createHttpLink } = require(`apollo-link-http`)
const { buildSchema, printSchema } = require(`graphql`)
const { makeRemoteExecutableSchema, transformSchema, introspectSchema, RenameTypes } = require(`graphql-tools`)
const AUTH_TYPE = require('aws-appsync/lib/link/auth-link').AUTH_TYPE
const AWS = require('aws-sdk');
const { createAppSyncLink } = require('aws-appsync');

exports.sourceNodes = async ( { actions, createNodeId, cache, createContentDigest }, options ) => {
  const { createNode } = actions
  delete options.plugins
  const { typeName, fieldName, refetchInterval, HOST, PATH, REGION, AWS_ACCESS_KEY_ID, AWS_SECRET_ACCESS_KEY } = options
  const url = HOST + PATH

  // making sure things are required properly
  invariant(
    typeName && typeName.length > 0,
    `gatsby-source-graphql requires option \`typeName\` to be specified`
  )
  invariant(
    fieldName && fieldName.length > 0,
    `gatsby-source-graphql requires option \`fieldName\` to be specified`
  )

  // Link to appsync
  const fetcherLink = createHttpLink({
    uri: url,
    fetch: fetch
  })

  const type = AUTH_TYPE.AWS_IAM

  AWS.config.update({
    region: REGION,
    credentials: new AWS.Credentials({
      accessKeyId: AWS_ACCESS_KEY_ID,
      secretAccessKey: AWS_SECRET_ACCESS_KEY
    })
  });

  const credentials = AWS.config.credentials;

  const link = createAppSyncLink({
    url: url,
    region: REGION,
    auth: { type, credentials },
    resultsFetcherLink: fetcherLink,
  });

  // Schema Creation
  let introspectionSchema
  const cacheKey = `gatsby-source-graphql-schema-${typeName}-${fieldName}`

  let sdl = await cache.get(cacheKey)

  console.log('sdl', sdl)
  if (!sdl) {
    introspectionSchema = await introspectSchema(link)
    sdl = printSchema(introspectionSchema)
  } else {
    introspectionSchema = buildSchema(sdl)
  }

  await cache.set(cacheKey, sdl)

  const remoteSchema = makeRemoteExecutableSchema({
    schema: introspectionSchema,
    link,
  })

  // Node creation
  const nodeId = createNodeId(`gatsby-source-graphql-${typeName}`)
  const node = createSchemaNode({
    id: nodeId,
    typeName,
    fieldName,
    createContentDigest,
  })
  createNode(node)

  const resolver = (parent, args, context) => {
    context.nodeModel.createPageDependency({
      path: context.path,
      nodeId: nodeId,
    })
    return {}
  }

  const schema = transformSchema(remoteSchema, [
    new StripNonQueryTransform(),
    new RenameTypes(name => `${typeName}_${name}`),
    new NamespaceUnderFieldTransform({ typeName, fieldName, resolver }),
  ])

  addThirdPartySchema({ schema })

  if (process.env.NODE_ENV !== `production`) {
    if (refetchInterval) {
      const msRefetchInterval = refetchInterval * 1000
      const refetcher = () => {
        createNode(
          createSchemaNode({
            id: nodeId,
            typeName,
            fieldName,
            createContentDigest,
          })
        )
        setTimeout(refetcher, msRefetchInterval)
      }
      setTimeout(refetcher, msRefetchInterval)
    }
  }
}

function createSchemaNode({ id, typeName, fieldName, createContentDigest }) {
  const nodeContent = uuidv4()
  const nodeContentDigest = createContentDigest(nodeContent)
  return {
    id,
    typeName: typeName,
    fieldName: fieldName,
    parent: null,
    children: [],
    internal: {
      type: `GraphQLSource`,
      contentDigest: nodeContentDigest,
      ignoreType: true,
    },
  }
}
这是我的错误消息:

TypeError:无法读取未定义的属性“store”

  • client.js:147 [gatsby source appsync]/[aws appsync]/lib/client.js:147:27

  • client.js:139.link.request [gatsby source appsync]/[aws appsync]/lib/client.js:139:23

  • bundle.umd.js:188 ApolloLink.request [gatsby source appsync]/[aws appsync]/[apollo link]/lib/bundle.umd.js:188:35

  • bundle.umd.js:188 ApolloLink.request [gatsby source appsync]/[aws appsync]/[apollo link]/lib/bundle.umd.js:188:35

  • bundle.umd.js:188 ApolloLink.request [gatsby source appsync]/[aws appsync]/[apollo link]/lib/bundle.umd.js:188:35

  • js:84 Object.execute [gatsby source appsync]/[apollo link]/lib/link.js:84:18

  • linkToFetcher.js:7 [gatsby source appsync]/[graphql工具]/dist/stitching/linkToFetcher.js:7:56

  • js:50 [gatsby source appsync]/[graphql工具]/dist/stitching/introspectSchema.js:50:42

  • js:31步骤 [gatsby source appsync]/[graphql工具]/dist/stitching/introspectSchema.js:31:23

  • js:12 Object.next [gatsby source appsync]/[graphql工具]/dist/stitching/introspectSchema.js:12:53

  • js:6 [gatsby source appsync]/[graphql工具]/dist/stitching/introspectSchema.js:6:71

  • 新承诺

  • js:2\uu waiter [gatsby source appsync]/[graphql工具]/dist/stitching/introspectSchema.js:2:12

  • js:41 introspectSchema [gatsby source appsync]/[graphql工具]/dist/stitching/introspectSchema.js:41:12

  • gatsby node.js:60 Object.exports.sourceNodes /workspace/plugins/gatsby-source-appsync/gatsby-node.js:60:33


以前很少使用graphql链接。有什么帮助吗?

对于您的场景,最好只使用
aws appsync
中的
createAuthLink
,因为
createAppSyncLink
为脱机场景引入了很多您似乎不需要的东西(此外,appsync的完整链接取决于apollo的查询管理器在操作上下文中插入缓存)

这样的东西可能适合你:

const{apollo-link}=require(`apollo-link`)
const{createAuthLink}=require(“aws appsync”);
const link=ApolloLink.from([
createAuthLink({
url:url,
地区:地区,,
身份验证:{type,credentials},
}),
获取链接
]);

对于您的场景,最好只使用
aws appsync
中的
createAuthLink
,因为
createAppSyncLink
为脱机场景引入了许多您似乎不需要的内容(此外,appsync的完整链接取决于apollo的查询管理器在操作上下文中插入缓存)

这样的东西可能适合你:

const{apollo-link}=require(`apollo-link`)
const{createAuthLink}=require(“aws appsync”);
const link=ApolloLink.from([
createAuthLink({
url:url,
地区:地区,,
身份验证:{type,credentials},
}),
获取链接
]);