Estoy tratando de usar GraphQL con mysql en un servidor node js express.
pero recibo este error cada vez que ejecuto mi consulta
aquí está el error:
{ "errors": [ { "message": "Expected Iterable, but did not find one for field \"RootQueryType.getAllGoals\".", "locations": [ { "line": 2, "column": 3 } ], "path": [ "getAllGoals" ] } ], "data": { "getAllGoals": null } }aquí está mi consulta Graphql:
query { getAllGoals { title progress goal } }Obtengo el resultado esperado de "SELECT * FROM (my table)", pero me da un error cuando trato de devolverlo para GraphQL desde el resolutor como se muestra en el siguiente código:
const RootQuery = new GraphQLObjectType({ name: "RootQueryType", fields: { getAllGoals: { type: new GraphQLList(GoalType), resolve(parent, args) { return db.query("SELECT * FROM myTable", (err, result) => { if (err) throw err console.log(JSON.parse(JSON.stringify(result))) return JSON.parse(JSON.stringify(result)) }) } } } })Revisé si tengo algún conflicto en mi GraphQLObjectType GoalType, pero no tuve ninguno.
Lo arreglé, solo necesitaba hacer una promesa que incluía la consulta (como se muestra a continuación):
async resolve(parent, args) { var p = new Promise((resolve, reject) => { db.query("SELECT * FROM myTable", (err, result) => { console.log(JSON.parse(JSON.stringify(result))) resolve(JSON.parse(JSON.stringify(result))) }) }) return p }Su método de resolve devuelve lo que devuelve db.query , pero esto no es lo que espera GraphQL: espera el resultado de la consulta, o una promesa que se resuelve en este resultado. Puede usar util.promisify para obtener tal promesa.
Si también desea registrar el resultado, use un método .then como se muestra aquí:
resolve(parent, args) { return util.promisify(db.query)("SELECT * FROM myTable") .then(result => { console.log(result); return result; }); } (¿Cuál es el propósito de JSON.parse(JSON.stringify(...)) ?)