微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

Keystone Next 自定义 graphql 突变和外部前端

如何解决Keystone Next 自定义 graphql 突变和外部前端

嘿,我正在尝试使自定义突变在具有“外部”反应、next 和 apollo 前端的 keystone-next 中工作,但是从前端调用突变时遇到问题,但从前端调用突变时却没有问题Keystone api 浏览器。突变真的很简单。

架构扩展:

export const extendedGqlSchema = graphQLSchemaExtension({
  typeDefs: graphql`
    type Mutation {
      testAvailability(name: String): String
    }
  `,resolvers: {
    Mutation: {
      testAvailability: testAvailability,},});

解析器函数(不同的文件):

export const testAvailability = (
  root: any,{ name }: { name: string },context: KeystoneContext
): string => {
  if (context) {
    return new Date().toUTCString() + ": Hi " + name + ",I'm here!";
  }
  return new Date().toUTCString() + ": No context";
};

有效的原始 http 请求正文是:

{
    "operationName": null,"variables": {},"query": "mutation {\n  testAvailability(name: \"Eve\")\n}\n"
}

而原始 http 前端生成的请求正文如下所示:

{
    "operationName": "testAvailability","variables": {
        "name": "Eve"
    },"query": "mutation testAvailability($name: String) {\n  testAvailability(name: $name) {\n    name\n    __typename\n  }\n}\n"
}

当我使用完全相同的标头从 Postman 运行这些请求时,第一个仍然有效,而第二个仍然无效(没有身份验证等)。 400 bad request response 返回的错误如下:

{
    "errors": [
        {
            "message": "Cannot assign to read only property 'path' of object '#<Object>'","extensions": {
                "code": "INTERNAL_SERVER_ERROR","exception": {
                    "stacktrace": [
                        "TypeError: Cannot assign to read only property 'path' of object '#<Object>'","    at formatError (%ProjectPath%\\backend\\node_modules\\@keystone-next\\keystone\\dist\\createApolloServer-231615cf.cjs.dev.js:82:24)","    at %ProjectPath%\\backend\\node_modules\\apollo-server-errors\\src\\index.ts:287:28","    at Array.map (<anonymous>)","    at Object.formatApolloErrors (%ProjectPath%\\backend\\node_modules\\apollo-server-errors\\src\\index.ts:285:25)","    at formatErrors (%ProjectPath%\\backend\\node_modules\\apollo-server-core\\src\\requestPipeline.ts:665:12)","    at %ProjectPath%\\backend\\node_modules\\apollo-server-core\\src\\requestPipeline.ts:649:15","    at Generator.next (<anonymous>)","    at fulfilled (%ProjectPath%\\backend\\node_modules\\apollo-server-core\\dist\\requestPipeline.js:5:58)","    at runMicrotasks (<anonymous>)","    at processticksAndRejections (internal/process/task_queues.js:93:5)"
                    ]
                }
            }
        }
    ]
}

我错过了什么?

解决方法

如果您查看来自前端的第二个查询,基本上是这样的:

mutation testAvailability($name: String) {
  testAvailability(name: $name) {
    name
    __typename
  }
}

但是 testAvailability 返回的是 String,而不是一个对象,对吗?正确的查询可能更接近于此...

mutation testAvailability($name: String) {
  testAvailability(name: $name)
}

所以基本上,请检查您的前端查询。

我不确定 Cannot assign to read only property 'path' of object '#<Object>'" 错误是从哪里来的……如果我重现这个错误,我会得到一个 GRAPHQL_VALIDATION_FAILED 错误:

Field "testAvailability" must not have a selection since type "String" has no subfields.

哪个更有帮助!

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。