Apenas estoy comenzando con GraphQL y hasta ahora he trabajado principalmente con featherjs para crear API REST. Existe el concepto de ganchos para ejecutar código antes o después de interactuar con un servicio. Quería saber si hay una manera de lograr algo similar en una configuración de graphql.
La pila específica que estoy usando es neo4j y graphql , express y apollo server . Dado que neo4j tiene un módulo graphql, no estoy escribiendo las consultas y mutaciones generales, solo los tipos de modelos.
Para un ejemplo concreto, a continuación se muestra un servidor API básico. Se arma usando docker compose y tiene usuarios y aplicaciones. En general, me gustaría poder ejecutar código arbitrario antes o después de una mutación con acceso al modelo que se está modificando. Cosas como una validación más compleja antes o efectos secundarios después.
Esas cosas podrían estar aquí, por ejemplo, antes de cambiar el estado de una aplicación a declined , asegúrese de que se agregue una nota. O después de cambiar el estado a approved , envíe un correo electrónico al solicitante.
No estoy seguro de cómo o dónde implementar este tipo de cosas, ¡cualquier ayuda es apreciada! O también si estoy pensando mal en graphql y hay una mejor manera de hacer lo que estoy tratando de hacer.
¡Gracias!
import http from 'http'; import express from 'express'; import neo4j from 'neo4j-driver'; import {Neo4jGraphQL} from '@neo4j/graphql'; import {gql, ApolloServer} from 'apollo-server-express'; import {ApolloServerPluginDrainHttpServer} from 'apollo-server-core'; const typeDefs=gql` type User { email: String! applications: [Application!] @relationship(type: "APPLICANT", direction: OUT) } type Application { user: User! @relationship(type: "APPLICANT", direction: IN) state: String! note: String } `; const driver=neo4j.driver( 'neo4j://neo4j:7687', neo4j.auth.basic('neo4j', 'password') ); const {schema}=new Neo4jGraphQL({typeDefs, driver}); (async ()=>{ const app=express(); const server=http.createServer(app); const apollo=new ApolloServer({ schema, plugins: [ApolloServerPluginDrainHttpServer({httpServer: server})] }); await apollo.start(); apollo.applyMiddleware({app}); await new Promise(r=>server.listen({port: 4000}, r)); console.log('GraphQL server listening at '+apollo.graphqlPath); })();