【问题标题】:Passing multi line string in a Graphql mutation在 Graphql 突变中传递多行字符串
【发布时间】:2018-02-07 20:28:56
【问题描述】:

新手到GraphQL

我必须在mutation 中传递multiline 字符串(逐字)。我必须在单独的应用程序中读回文本并将其保存为文本文件。

这就是我想要做的。我正在尝试使用GraphiQL 客户端与GraphCool 中的测试服务器交谈。

mutation {
  createMessage(fullName: "John K", 
    message: "some very long text
message that appears on multiple lines 
with line breaks."    
}

我得到这个错误

{
"error": "Syntax error while parsing GraphQL query. Invalid input \"\"some very long text\\n\", expected StringValue, BooleanValue, NullValue, Variable, Comments, ObjectValue, EnumValue, NumberValue or ListValue (line 6, column 13):\n    message: \"some very long text\n            ^"
}

我可以通过将所有换行符替换为 \n 来解决此问题。

mutation {
  createMessage(fullName: "John K", 
    message: "some very long text\nmessage that appears on multiple\nlines\nwith line breaks."    
}

但是,我不确定这是否是正确的方法,因为当我读回消息文本并将其作为文本文件查看时,不会出现换行符,我得到的只是 \n。

请帮忙...

【问题讨论】:

  • 顺便说一句 - 您的查询中似乎缺少右括号。

标签: graphql


【解决方案1】:

已尝试使用 nodejs "graphql": "0.13.2",可以通过使用 """ 包装您的多行字符串来做到这一点:

(换行符仍应以\n 发送到graphql 端点,只是graphiql 可能会帮助您转义\)

示例:

这将失败message: "some very long text message that appears on multiple lines with line breaks."

这应该通过message: """some very long text message that appears on multiple lines with line breaks."""

【讨论】:

【解决方案2】:

您可以将字符串作为变量传递:

GraphQL 查询:

mutation($message: String) {
  createMessage(fullName: "John K", message: $message)
}

JS:

const message = `some very long text
message that appears on multiple lines 
with line breaks.`;

不确定您使用的是什么 GraphQL 客户端,但从这里您应该能够将变量传递给客户端。使用 Apollo (react-apollo) 它看起来像这样:

const CREATE_MESSAGE = gql`
  mutation($message: String) {
    createMessage(fullName: "John K", message: $message)
  }
`;

const message = `some very long text
message that appears on multiple lines 
with line breaks.`;

const CreateMessage = () => {    
  return (
    <Mutation mutation={CREATE_MESSAGE}>
      {(createMessage, { data }) => (
        <button onClick={() => createMessage({ variables: { message } })}>
          Create Message
        </button>
      )}
    </Mutation>
  );
};

【讨论】:

    【解决方案3】:

    花了很多时间后,它对我有用

    如果您使用的是 GraphQL Apollo 客户端 """${yourText}""" 会帮助你。

    const yourText = "Lorem ipsum 
                      is simply dummy
                      standard dummy";
    const input = {
                    singleLine : "my name is kool",
                    multiLine  : `""${yourText}""`
                  }
    

    谢谢K00L ;)

    【讨论】:

      【解决方案4】:

      目前在 graphql 中不可能。不过有some RFC

      所以,我猜,您最好的办法是处理您的输入并将文字字符 \n 替换为换行符。根据您输入的内容,这可能会产生一些误报...

      【讨论】:

      • 谢谢塞尔吉奥。因此,如果没有标准选项,我猜使用 '\n' 并没有特别的好处 - 我的意思是我几乎可以使用任何我知道在回读后必须用换行符替换的字符。对吗?
      猜你喜欢
      • 2019-11-19
      • 1970-01-01
      • 2020-08-16
      • 2021-11-10
      • 1970-01-01
      • 2022-08-18
      • 2021-10-14
      • 2021-06-30
      • 2020-05-05
      相关资源
      最近更新 更多