Javascript GraphQL:从对象生成查询参数
如果我有一个对象:Javascript GraphQL:从对象生成查询参数,javascript,graphql,graphql-js,Javascript,Graphql,Graphql Js,如果我有一个对象: {"where":{"publishedAt_lt":"2018-01-01"}} 如何将其转换为适合查询参数的字符串 articles(where: {publishedAt_lt: "2018-01-01"}) 这并不能回答您的问题,但如果您遵循最佳实践,您的问题通常不会出现:GraphQL查询应该是静态的——这意味着您不会从变量输入生成它们。也许您对此有一个有效的用例,但我很难想象有任何用例。请在评论中告诉我 当客户端为字段参数提供变量输入时,您希望改用变量: qu
{"where":{"publishedAt_lt":"2018-01-01"}}
如何将其转换为适合查询参数的字符串
articles(where: {publishedAt_lt: "2018-01-01"})
这并不能回答您的问题,但如果您遵循最佳实践,您的问题通常不会出现:GraphQL查询应该是静态的——这意味着您不会从变量输入生成它们。也许您对此有一个有效的用例,但我很难想象有任何用例。请在评论中告诉我 当客户端为字段参数提供变量输入时,您希望改用变量:
query getArticles($filter: ArticlesFilter) { # Please insert your input type name
articles(where: $filter) {
# ...
}
}
然后,您可以在查询的变量字段中传入此输入:
let givenObject = {"where":{"publishedAt_lt":"2018-01-01"}}; // said object
fetch('/graphql', {
method: 'POST',
body: JSON.stringify({
query, // put the query string from above
variables: {
filter: givenObject,
},
}),
});
这是纯JS,请参考您的客户端库。我相信他们有一个关于这方面的文档部分。对于react apollo,您可以找到如何传递变量的文档。这不是回答您的问题,但如果您遵循最佳实践,您的问题通常不会出现:GraphQL查询应该是静态的,这意味着您不会从变量输入生成查询。也许您对此有一个有效的用例,但我很难想象有任何用例。请在评论中告诉我 当客户端为字段参数提供变量输入时,您希望改用变量:
query getArticles($filter: ArticlesFilter) { # Please insert your input type name
articles(where: $filter) {
# ...
}
}
然后,您可以在查询的变量字段中传入此输入:
let givenObject = {"where":{"publishedAt_lt":"2018-01-01"}}; // said object
fetch('/graphql', {
method: 'POST',
body: JSON.stringify({
query, // put the query string from above
variables: {
filter: givenObject,
},
}),
});
这是纯JS,请参考您的客户端库。我相信他们有一个关于这方面的文档部分。对于react apollo,您可以找到如何传递变量的文档。这看起来是一个有趣的库,我建议您查看一下: 但基本上,我们需要做的就是将对象转换为字符串,同时确保键不采用双引号,整数不转换为字符串,因为这可能无法很好地处理我们正在使用的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
}
}
}
}`
} );
话虽如此,我还是要去看看上面提到的图书馆,并可能继续使用它。这看起来是一个有趣的图书馆,我建议你去看看: 但基本上,我们需要做的就是将对象转换为字符串,同时确保键不采用双引号,整数不转换为字符串,因为这可能无法很好地处理我们正在使用的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
}
}
}
}`
} );
话虽如此,我还是要看看上面提到的库,并可能继续使用它。试试这个:
const { where } = {"where":{"publishedAt_lt":"2018-01-01"}}
articleList = articles({where}) // assume articles takes an object - equivalent to articles({where: where}) or articles({where: {publishedAt_lt: "2018-01-01"}}
试试这个:
const { where } = {"where":{"publishedAt_lt":"2018-01-01"}}
articleList = articles({where}) // assume articles takes an object - equivalent to articles({where: where}) or articles({where: {publishedAt_lt: "2018-01-01"}}
我采用KMcAloon方法,使其也支持阵列。这样,您就可以完全将查询作为一个对象,并在最后一步中将其包装为=>例如
mutation createPackage {
createPackage(
data: ${queryfy(data)}
) {
name
_id
})
}
/**
*易怒的。
*
*为graphql查询中的插值准备javascript对象。
*
*@param{mixed}obj
*@返回模板字符串。
*/
常量queryfy=obj=>{
//确保我们不改变整数。
如果obj的类型==‘编号’{
返回obj;
}
if Array.isArrayobj{
const-props=obj.mapvalue=>`${queryvalue}`.join',';
返回“[${props}]”;
}
如果obj的类型==“对象”{
const props=Object.keysobj
.mapkey=>`${key}:${queryfyobj[key]}`
。加入“,”;
返回“{${props}}”;
}
返回JSON.stringifyobj;
}; 我采用KMcAloon方法,使其也支持阵列。这样,您就可以完全将查询作为一个对象,并在最后一步中将其包装为=>例如
mutation createPackage {
createPackage(
data: ${queryfy(data)}
) {
name
_id
})
}
/**
*易怒的。
*
*为graphql查询中的插值准备javascript对象。
*
*@param{mixed}obj
*@返回模板字符串。
*/
常量queryfy=obj=>{
//确保我们不改变整数。
如果obj的类型==‘编号’{
返回obj;
}
if Array.isArrayobj{
const-props=obj.mapvalue=>`${queryvalue}`.join',';
返回“[${props}]”;
}
如果obj的类型==“对象”{
const props=Object.keysobj
.mapkey=>`${key}:${queryfyobj[key]}`
。加入“,”;
返回“{${props}}”;
}
返回JSON.stringifyobj;
};那正是你已经拥有的?在这个例子中,一个键周围的引号是没有意义的。这就是一个例子。我有一个简单的JS对象,它来自外部,我需要将它转换为gql Arguments。你能发布你的完整查询吗?这正是你已经拥有的吗?在这个例子中,一个键周围的引号是没有意义的。这就是一个例子。我有一个简单的JS对象,它来自外部,我需要将它转换为gql Arguments。你能发布完整的查询吗?我有一个有效的用例:在其他graphql主机之上构建的服务器解析器中转换变量是的,我有一个有效的用例:在构建在其他graphql主机之上的服务器解析程序中转换变量
任何细微差别。我知道lib——我在那里做出了贡献。事实上,这个问题有我自己的答案,链接到这个库,但主持人毫无理由地删除了它。这是一个更复杂的任务,有很多细微差别。我知道lib——我在那里做出了贡献。事实上,有我自己的答案这个问题的链接到这个图书馆,但版主删除它没有任何理由