Это похоже на интересную библиотеку, я бы посоветовал проверить ее:
https://www.npmjs.com/package/json-to-graphql-query
Но в основном все, что нам нужно сделать, - это преобразовать объект в строку, обеспечивая при этомключи не принимают двойные кавычки, а целые числа не преобразуются в строки, так как это может не очень хорошо сочетаться со схемами graphql, с которыми мы работаем.
Так как JSON.stringify () этого не сделает, я придумал эту маленькую функцию, чтобы помочь с интерполяцией аргументов в мои запросы:
/**
* Queryfy.
*
* Prep javascript objects for interpolation within graphql queries.
*
* @param {mixed} obj
* @return template string.
*/
const queryfy = obj => {
// Make sure we don't alter integers.
if( typeof obj === 'number' ) {
return obj;
}
// Stringify everything other than objects.
if( typeof obj !== 'object' || Array.isArray( obj ) ) {
return JSON.stringify( obj );
}
// Iterate through object keys to convert into a string
// to be interpolated into the query.
let props = Object.keys( obj ).map( key =>
`${key}:${queryfy( obj[key] )}`
).join( ',' );
return `{${props}}`;
}
Вот уменьшенная часть моегокод, в котором я успешно использую это:
const dateQuery = {};
if( !! date1 ) {
dateQuery.after = {
year: parseInt( date1.format( 'YYYY' ) ),
month: parseInt( date1.format( 'M' ) ),
day: date1.format( 'D' ) - 1,
}
}
if( !! date2 ) {
dateQuery.before = {
year: parseInt( date2.format( 'YYYY' ) ),
month: parseInt( date2.format( 'M' ) ),
day: date2.format( 'D' ) - 1,
}
}
const query = await client.query( {
query: gql `{
apiResponses( where: {
dateQuery: ${queryfy( dateQuery )}
} ) {
edges {
node {
apiResponseId
title
date
json
}
}
}
}`
} );
При этом я собираюсь проверить упомянутую библиотеку и, вероятно, использовать ее для продвижения вперед.