FieldUndefined 类型的验证错误:“Query”类型中的“register”字段未定义

2023-12-31

我是 GrapQL 的新手。我正在尝试将它与 Spring Boot 一起使用。我可以成功进行查询,它正在返回我需要的数据,但我现在想使用突变。当他注册时,我需要向数据库添加一个用途。

这是我的 schema.graphqls 文件:

type Token {
    token: String
}
type Register {
    message: String
}
type User {
    username: String!
    firstName: String!
    lastName: String!
    password: String!
    role: String!
}

type Query {
    login(username: String, password: String): Token
}

type Mutation {
    register(input: RegisterUserInput!): Register
}

input RegisterUserInput {
    username: String!
    firstName: String!
    lastName: String!
    password: String!
    role: String!
}

schema {
    query: Query
    mutation: Mutation
}

正如你所看到的,register 是 Mutation 类型,它像 Query 一样添加到 schema 中。但由于某种原因,它看起来并没有进入 Mutation,它只是试图在 Query 中查找类型。

这是我的控制器:

@Autowired
    private UserService userService;

    /**
     * Login the user and return generated token
     * @param query
     * @return String token
     */
    @PostMapping("/login")
    public ResponseEntity<Object> login(@RequestBody String query){
        ExecutionResult executionResult = userService.getGraphQL().execute(query);

        // Check if there are errors
        if(!executionResult.getErrors().isEmpty()){
            return new ResponseEntity<>(executionResult.getErrors().get(0).getMessage(), HttpStatus.UNAUTHORIZED);
        }

        return new ResponseEntity<>(executionResult, HttpStatus.OK);
    }

    /**
 * Create new user and save him to database
 * @param mutation
 * @return String message
 */
@PostMapping("/register")
public ResponseEntity<Object> register(@RequestBody String mutation){
    ExecutionResult executionResult = userService.getGraphQL().execute(mutation);

    // Check if there are errors
    if(!executionResult.getErrors().isEmpty()){
        return new ResponseEntity<>(executionResult.getErrors().get(0).getMessage(), HttpStatus.UNAUTHORIZED);
    }

    return new ResponseEntity<>(executionResult, HttpStatus.OK);
}

正如我所说,登录工作正常,但注册返回我在标题中提到的错误。

我的服务等级:

@Value("classpath:graphql-schema/schema.graphqls")
    Resource resource;

    private GraphQL graphQL;

    @Autowired
    private LoginDataFetcher loginDataFetcher;
    @Autowired
    private RegisterDataFetcher registerDataFetcher;

    @PostConstruct
    public void  loadSchema() throws IOException{
    // Get the schema
    File schemaFile = resource.getFile();

    // Parse schema
    TypeDefinitionRegistry typeDefinitionRegistry = new SchemaParser().parse(schemaFile);
    RuntimeWiring runtimeWiring = buildRuntimeWiring();
    GraphQLSchema graphQLSchema = new SchemaGenerator().makeExecutableSchema(typeDefinitionRegistry, runtimeWiring);
    graphQL = GraphQL.newGraphQL(graphQLSchema).build();
}

private RuntimeWiring buildRuntimeWiring() {
    return RuntimeWiring.newRuntimeWiring()
            .type("Query", typeWiring ->
                typeWiring
                    .dataFetcher("login", loginDataFetcher))
            .type("Mutation", typeWiring ->
                typeWiring
                    .dataFetcher("register", registerDataFetcher))
            .build();
}

public GraphQL getGraphQL() {
    return graphQL;
}

我的登录数据获取器:

@Autowired
    private AppUserRepository appUserRepository;

    private JwtGenerator jwtGenerator;

    public LoginDataFetcher(JwtGenerator jwtGenerator) {
        this.jwtGenerator = jwtGenerator;
    }

    @Override
    public TokenDAO get(DataFetchingEnvironment dataFetchingEnvironment) {
        String username = dataFetchingEnvironment.getArgument("username");
        String password = dataFetchingEnvironment.getArgument("password");

        AppUser appUser = appUserRepository.findByUsername(username);

        // If user is not foung
        if(appUser == null){
            throw new RuntimeException("Username does not exist");
        }

        // If the user is fount check passwords
        if(!appUser.getPassword().equals(password)){
            throw new RuntimeException("Incorrect password");
        }

        // Generate the token
        String token = jwtGenerator.generate(appUser);

        return new TokenDAO(token);
    }

注册数据获取器:

@Autowired
    private AppUserRepository appUserRepository;

    @Override
    public RegisterDAO get(DataFetchingEnvironment dataFetchingEnvironment) {
        String username = dataFetchingEnvironment.getArgument("username");
        String firstName = dataFetchingEnvironment.getArgument("firstName");
        String lastName = dataFetchingEnvironment.getArgument("lastName");
        String password = dataFetchingEnvironment.getArgument("password");
        String role = dataFetchingEnvironment.getArgument("role");

        AppUser appUser = appUserRepository.findByUsername(username);

        // Check if username exists
        if(appUser != null){
            throw new RuntimeException("Username already taken");
        }

        AppUser newAppUser = new AppUser(username, password, role, firstName, lastName);

        // Save new user
        appUserRepository.save(newAppUser);

        return new RegisterDAO("You have successfully registered");
    }

我在控制台中收到的错误:

graphql.GraphQL                          : Query failed to validate : '{
    register(username: "user", firstName: "Bla", lastName: "Blabla", password: "password", role: "DEVELOPER") {
        message
    }
}'

感谢您的帮助。

UPDATE

根据我得到的答案,我像这样更改了我的架构文件:

query UserQuery{
    login(username: String, password: String){
        token
    }
}

mutation UserMutation{
    register(input: RegisterUserInput) {
        message
    }
}

input RegisterUserInput {
    username: String!
    firstName: String!
    lastName: String!
    password: String!
    role: String!
}

schema {
    query: UserQuery
    mutation: UserMutation
}

但现在我收到这个错误:

解析类型“query”时不存在操作类型“UserQuery” 解析类型“mutation”时不存在操作类型“UserMutation”

那么现在的问题是什么呢?我怎样才能做到这一点?


您告诉 GraphQL 您正在请求一个查询,而实际上register是一个突变。编写 GraphQL 请求时,查询语法通常遵循以下格式:

query someOperationName {
  login {
    # other fields
  }
}

在编写突变时,您只需指定即可:

mutation someOperationName {
  register {
    # other fields
  }
}

您可以省略操作名称,但最好将其包含在内。您可能会看到以下格式的示例:

{
  someQuery {
    # other fields
  }
}

在这种情况下,两个操作name和操作type(查询与突变)被遗漏了。这仍然是一个有效的请求,因为 GraphQL 只是假设您的意思是query当您离开操作类型时。从规格来看:

如果文档仅包含一个操作,则该操作可以未命名或以速记形式表示,从而省略查询关键字和操作名称。

所以在你的请求中,GraphQL 假设register是一个查询,而实际上它是一个突变,并且结果返回一个错误。

同样,在编写请求时,最好始终包含操作名称和查询/突变关键字。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

FieldUndefined 类型的验证错误:“Query”类型中的“register”字段未定义 的相关文章

随机推荐

  • 如何在 Spring Boot 2.0 中注册自定义环境后处理器?

    我按照这个中的确切步骤进行操作文档 https docs spring io spring boot docs 1 5 x SNAPSHOT reference htmlsingle boot features application ev
  • IE8 中的 Jquery 问题

    Jquery 在 Safari 和 Firefox 中运行良好 在 IE8 中 使用开发人员工具 我收到错误 无法获取位置属性 无效参数 jquery 1 3 2 js 第 12 行字符 12949 通过调试 脚本突出显示字符 J G K
  • Kubernetes 配置:在代码存储库上与在 helm 图表存储库上

    Helm 被宣传为 管理 k8s 上应用程序部署的方式 我们的微服务具有代码存储库和可部署的 1 对 1 映射 我发现将 k8s 配置映射与代码一起使用要方便得多 以便它们一起发展 例如为功能标志添加新的环境变量时 然而 我们维护的是一个
  • Asp.net Core 自定义过滤器实现 IActionModelConvention 和 IFilterFactory

    我需要创建一个实现两者的自定义操作过滤器IActionModelConvention and IFilterFactory I use IActionModelConvention用于同时设置多条路线 我使用IFilterFactory注入
  • Java中忽略大小写

    我想知道如何使用户输入的任何内容在我的方法中忽略大小写 public static void findPatient if myPatientList getNumPatients 0 System out println No patie
  • 需要使用 Android 模拟器进行身份验证的代理

    有没有人设法让 Android 模拟器在需要身份验证的代理后面工作 我尝试将 http proxy 参数设置为 http DOMAIN USERNAME PASSWORD IP PORT 但我没有成功 我尝试按照文档进行操作 但没有成功 我
  • docker image ubuntu:16.04 似乎省略了 logrotate 的一些文件

    我根据以下内容构建了一个图像ubuntu 16 04 在构建图像时 我确实运行了一些命令 包括apt get y update 然后 我浏览图像docker run it myimage bash我发现有一些遗漏的文件logrotate在那
  • 使用 open cv Mat::at 时出现段错误

    我试图用一些值填充 opencv 矩阵 但我不断出现段错误 代码如下 Mat mask gx in window size in window size image type for int i 0 i lt in window size
  • Linux下多线程进程的信号SIGTERM处理

    我在Linux下调试一个多线程进程的信号处理时 发现了一种奇怪的现象 这个问题的一句话是 SIGTERM handler为空并且已成功注册到系统 但进程启动时仍可能被SIGTERM杀死 详细说明如下 该进程由父进程派生 并由execve 处
  • 同步两个ListView位置

    我有两个列表视图 当我滚动任何一个列表时 有什么方法可以同步 ListViews 的位置 实施一个AbsListView OnScrollListener http developer android com reference andro
  • Azure Web App:发布前删除所有文件

    使用以下 Powershell 脚本发布到 Azure Web App 时 我们经常会遇到问题 即先前发布的文件会导致运行时错误 param websiteName packOutput website Get AzureWebsite N
  • xunit 扩展/行测试发生了什么?

    在 NUnit 2 4 7 中 包含了 nunit framework extensions dll 这使得可以进行 RowTests 下载最新版本 2 5 8 时我找不到它 这是怎么回事 而不是使用RowTest 您可以使用TestCas
  • Solr/Lucene 是否可以先按相关性排序,然后再按第二个属性排序?

    在 Solr Lucene 中 是否可以首先按相关性排序 然后再按第二个属性排序 据我所知 如果我设置了排序参数 它会完全覆盖相关性 并按排序参数进行排序 我如何才能首先按相关性对结果进行排序 然后在两个具有完全相同相关性的条目的情况下 对
  • 更有效地检测检查(国际象棋)

    我目前正在开发一个国际象棋引擎 该引擎到目前为止正在运行 但需要很长时间才能生成棋步 由于必须生成许多移动 因此检查检测花费的时间是迄今为止最长的 在尝试了很多事情之后我陷入了困境 并且无法真正弄清楚如何提高效率 我是这样做的 为了检查移动
  • 如何使用图形对象渲染 WPF Hwnd

    之后RenderTargetBitmap就太慢了 我尝试了一种不同的方法 不幸的是我的尝试没有成功 希望你们中的一些人能够弄清楚为什么这段代码不起作用 var myPopup new Popup var child new Grid Bac
  • 使用带有时区的 Simple DateTimeFormatter 时获取错误的解析日期

    我有以下代码 SimpleDateFormat format new SimpleDateFormat EEE MMM dd HH mm ss z yyyy String s2 Mon Oct 19 19 52 21 IST 2015 Sy
  • 等待 Future 时 Dart 超时

    如何制作一个await future持续时间不超过5秒 我需要它 因为在某些网络操作中 连接有时会产生无提示错误 因此 我的客户只是等待了几个小时而没有回复 相反 我希望它在客户端等待超过 5 秒时触发错误 我的代码可以触发错误 但仍在等待
  • 循环执行速度控制

    有没有办法控制循环的执行速度 我有一个以 30000 步循环运行的模拟 我想可视化该循环中发生的情况 如果可能的话 在其运行时控制执行速度 我有什么想法可以做到这一点吗 你可以添加一个sleep http download oracle c
  • 如何使用 WinForms (.NET) 绘制圆角矩形?

    使用C 绘制矩形 我需要首先在每个边缘绘制圆弧 然后我需要单击按钮它将在边缘绘制圆弧 我该怎么做 C 中的图形类没有用于绘制圆角矩形的内置方法 但是有多种方法可以实现此效果 答案中的链接杰伊 里格斯 https stackoverflow
  • FieldUndefined 类型的验证错误:“Query”类型中的“register”字段未定义

    我是 GrapQL 的新手 我正在尝试将它与 Spring Boot 一起使用 我可以成功进行查询 它正在返回我需要的数据 但我现在想使用突变 当他注册时 我需要向数据库添加一个用途 这是我的 schema graphqls 文件 type