将字符串数组传递给GraphQL查询,在嵌入时转换为整数

Ele*_*ena 1 javascript reactjs graphql template-literals

我试图想出一种方法来传递一个字符串数组并将其嵌入到查询中(使用React,GraphQL).问题是它接受参数作为字符串数组,但在嵌入时将其转换为字符串.

假设我有这个函数调用来获取一些数据.(我现在对这个论点进行了硬编码,但是一旦我弄清楚它就会变成一个变量).

//这里我正在调用这个函数

 const query = getData.generate(["123", "456"]);
        return GraphqlClient.query(query)
        .then((e) => {
            return e.data.oneAppProviders;
        }) .......
Run Code Online (Sandbox Code Playgroud)

//这里是带有嵌入参数的查询.(后端需要一个字符串数组.)

export default {
generate(id) {
// console.log(id)        // output: ["123", "456"]
    return { query : gql`{
        oneAppProviders(id: ${id}) {
            id
            firstName
         }
    }
}}
Run Code Online (Sandbox Code Playgroud)

当我运行它时,我收到此错误:

GraphQLError {message: "Syntax Error: Expected Name, found Int "456""
Run Code Online (Sandbox Code Playgroud)

我想,当我嵌入它时,它将它转换为整数...如果我的数组是["123"],我会收到以下错误:

[GraphQL error]: Message: Expected type [String], found 123.
Run Code Online (Sandbox Code Playgroud)

我希望这个问题足够清楚.提前致谢.

Dav*_*aze 5

作为一般规则,您应该避免像这样将数据嵌入到查询语言字符串中。(如果id变量实际上是包含括号和花括号的字符串怎么办? https://xkcd.com/327是您面临的潜在问题的一个更著名的示例,尽管是虚构的。)

GraphQL 支持顶级查询参数,您应该在此处使用这些参数。如果您的查询类似于

query Providers($ids: [ID!]!) {
    oneAppProviders(id: $ids) {
        id
        firstName
     }
}
Run Code Online (Sandbox Code Playgroud)

大多数查询库都有一种传递附加参数的方法;所以在你的情况下可能看起来像

const query = gql`...`;
const variables = { ids: ids };
GraphqlClient.query(query, variables).then(...);
Run Code Online (Sandbox Code Playgroud)


小智 5

解决您问题的简单方法如下:

let myarray = ["string1", "string2", "String3"];
let dataToSend = myarray.toString();
let gql`
{
   passArray(data:${dataToSend}){
   }
}`;
Run Code Online (Sandbox Code Playgroud)


Gus*_*Gus 5

也许这有助于某人:

export const UserFlagsQuery = gql`
  query($flags: [String!]!) {
    user {
      flags(where: { AND: [{ name_in: $flags }, { enabled: true }] }) {
        name
        enabled
      }
    }
  }
`;
Run Code Online (Sandbox Code Playgroud)

在 ReactQuery组件中使用此查询,如下所示:

<Query
  query={UserFlagsQuery}
  variables={{
    flags: ["flag1", "flag2", "..."],
  }}
>
Run Code Online (Sandbox Code Playgroud)

感谢@David Maze 的回答。