I'm doing my first server with graphql, all great except for the part of the subscriptions, I get the following error "subscriptionsClient.subscribe is not a function"
this is the code of my resolve
const Curso = require('./models/Curso');
const Profesor = require('./models/Profesor');
const { PubSub } = require('graphql-subscriptions');
const pubsub = new PubSub();
const resolvers = {
Query: {
//los datos de las relaciones que tiene el modelo, el parametro que lleva eager es el
//nombre definido dentro del archivo que esta la relacion
cursos: () => Curso.query().eager('[profesor, comentarios]'),
profesores: () => Profesor.query().eager('cursos'),
// en el objeto args llegan los parametros que se definan en Query en este caso curso solo tiene id
curso: (rootValue, args) => Curso.query().eager('[profesor, comentarios]').findById(args.id),
profesor: (rootValue, args) => Profesor.query().eager('cursos').findById(args.id),
search: (_, args) => {
return [
Profesor.query().findById(5),
Curso.query().findById(5)
]//se devuelve array de promises
}
Mutation: {
//Verificar documentacion de objection para saber la respuesta de sus metodos
profesorAdd: (_, args) => { //estos metodos siempre reciben 2 parametros (rootValue, args), rooValue lo ponemos como _ para denotar que no se usa
return Profesor.query().insert(args.profesor);
},
profesorEdit: (_, args) => {
return Profesor.query().patchAndFetchById(args.Id, args.profesor);
},
profesorDelete: (_, args) => {
return Profesor.query().findById(args.Id).then( (profesor) => {
return Profesor.query().deleteById(args.Id).then( (rowsAfected) => {
if(rowsAfected > 0) return profesor;
//Se usa el template tag ´ para poder agregar variables dentro del string
throw new Error('No se afecto ningun registro porque el profesor con id ${args.Id} no existe');
} );
} );
},
cursoAdd: (_, args) => {
return Curso.query().insert(args.curso).then( (course) => {
pubsub.publish('commentAdded', { commentAdded: { id: course.id, nombre: 'Nuevo comentario!' }});
});
},
cursoEdit: (_, args) => {
return Curso.query().patchAndFetchById(args.Id, args.curso);
},
cursoDelete: (_, args) => {
console.log(Curso.responseCourse);
return Curso.query().findById(args.Id).then( (curso) => {
return Curso.query().deleteById(args.Id).then( () => curso );
} );
}
},
Subscription: {
commentAdded: {
subscribe: () => pubsub.asyncIterator('commentAdded')
}
}
}
module.exports = resolvers;
// This is the code of my schema
const { makeExecutableSchema } = require('graphql-tools');
const resolvers = require('../resolvers');
const profesor = require('./Curso');
const curso = require('./Profesor');
const rootQuerys = '
union responseSearch = Profesor | Curso
type Query {
cursos: [Curso]
profesores: [Profesor]
curso(id: Int) : Curso
profesor(id: Int): Profesor
search(query: String!) : [responseSearch]
}
type Mutation {
profesorAdd(profesor: newProfesor) : Profesor
profesorEdit(Id: Int!, profesor: profesorEditable) : Profesor
profesorDelete(Id: Int!) : Profesor
cursoAdd(curso: newCurso) : Curso
cursoEdit(Id: Int!, curso: cursoEditable) : Curso
cursoDelete(Id: Int!) : Curso
}
type Subscription {
commentAdded : Comentario
}
'
const schema = makeExecutableSchema({
typeDefs: [rootQuerys, curso, profesor],
resolvers
});
module.exports = schema;