如何在GraphQL+Neo4j的GRANDStack项目中为字段添加唯一约束
解决方案
核心原理
你使用的@neo4j/graphql包原生提供了自动同步约束/索引的能力,无需手动执行Cypher语句。
操作步骤
- 找到项目中初始化
Neo4jGraphQL实例的代码文件,通常为src/index.js - 在实例化
Neo4jGraphQL之后、启动Apollo服务之前,调用assertIndexesAndConstraints方法,开启自动创建约束的配置 - 重启服务即可,后续所有
@unique指令对应的唯一性约束都会自动同步到Neo4j数据库
代码示例
import { Neo4jGraphQL } from "@neo4j/graphql"; import neo4j from "neo4j-driver"; import { ApolloServer } from "apollo-server"; import { readFileSync } from "fs"; // 加载schema定义 const typeDefs = readFileSync("./src/schema.graphql", { encoding: "utf-8" }); // 初始化Neo4j驱动 const driver = neo4j.driver( process.env.NEO4J_URI, neo4j.auth.basic(process.env.NEO4J_USER, process.env.NEO4J_PASSWORD) ); // 实例化Neo4jGraphQL const neoSchema = new Neo4jGraphQL({ typeDefs, driver }); // 自动同步约束和索引,核心代码 neoSchema.assertIndexesAndConstraints({ options: { create: true } }) .then(() => { // 约束同步完成后再启动Apollo服务 const server = new ApolloServer({ schema: neoSchema.schema }); return server.listen({ port: process.env.PORT || 4000 }); }) .then(({ url }) => { console.log(`服务启动成功,GraphQL端点地址:${url}`); });
注意事项
- 你当前使用的
@neo4j/graphql@2.4.0版本完全支持该功能,无需调整依赖版本 - 该方法只会创建缺失的约束,已有约束不会被覆盖或重复创建,每次服务启动执行无副作用
- 同步完成后,重复创建
username或mail字段的用户时,会直接抛出唯一性校验错误,无需额外业务层判断
内容的提问来源于stack exchange,提问作者Jimmy Soussan
相关产品推荐
相关产品推荐

