Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/visual-studio-2008/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript GraphQL:从对象生成查询参数_Javascript_Graphql_Graphql Js - Fatal编程技术网

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——我在那里做出了贡献。事实上,有我自己的答案这个问题的链接到这个图书馆,但版主删除它没有任何理由