【问题标题】:GraphQL - Unknown directive "unique"GraphQL - 未知指令“唯一”
【发布时间】:2019-03-19 22:05:48
【问题描述】:

我刚刚将 GraphQL 从版本 0.13.2 更新到 14.0.2。启动服务器时,我收到错误消息:Error: Unknown directive "unique"。这是我的架构:

const { gql } = require('apollo-server')

// type Query is the root query
exports.typeDefs = gql`
type User {
    username: String! @unique
    password: String!
}

type Query {
    getAllUsers: User
}

请注意,尽管我使用的是 apollo-server 中的 gql,但它实际上是在使用 GraphQL。

正如您所看到的,问题是我已经做到了,所以用户名必须是唯一的。 GraphQL 的更新版本不能再有这个指令。果然,删除@unique 解决了这个问题。我仍然希望用户名是唯一的。我读过您可以创建自定义指令。我该怎么做呢?

【问题讨论】:

  • @unique 指令特定于某些产品,例如 Prisma,它扩展了 GraphQL.js 提供的基本功能。它不是 GraphQL.js 模块的一部分,因此升级不会有什么不同。您是否在 GraphQL 之上(在 Apollo 服务器之外)使用 Prisma 或其他层?
  • 如果不是,您想通过@unique 指令引入什么行为?除非您的类型定义用于创建底层数据库模式,这是 Prisma 等工具所做的,否则就如何解决 GraphQL 请求而言,不清楚将字段声明为“唯一”实际上会做什么。
  • @avatarhzh 你找到解决方案了吗?我也被这个问题困住了。
  • @Progeeker 不,我刚刚从架构中删除了@unique。我使用的是 Mongoose/MongoDB,所以只需要用户名在 Mongoose 模型中是唯一的。

标签: graphql graphql-js


【解决方案1】:

在将 graphql-tools 升级到 v14 使用完全自定义指令时,我遇到了与您类似的情况,架构中需要指令的定义。你可以通过字段、对象、突变来指定你的指令在哪里起作用。

directive @requireAuth on FIELD_DEFINITION

在现场级别从事类似的工作

extend type Query {
  me: String! @requireAuth
  user(userId: ID!):User!    
  users: [User]!  
}

而我的扩展 SchemaDirectiveVisitor 的类是这样的

import { SchemaDirectiveVisitor } from "apollo-server";

export class YourCustomDirective extends SchemaDirectiveVisitor {
    // Your code for the directive 
}

在提供的链接中,有可用的方法可用于在字段、对象、标量等级别拥有自定义逻辑。希望这可以帮助。

Schema Directive Visitor

【讨论】:

    猜你喜欢
    • 2019-07-24
    • 2021-02-07
    • 2022-01-02
    • 2020-08-14
    • 1970-01-01
    • 2018-11-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多