首页 > 解决方案 > Appsync graphQL 错误:“变量 'input' 已强制 NonNull 类型 'ID!' 的 Null 值”,尽管控制台日志记录 id

问题描述

我使用 react native 和 aws Appsync,我正在创建一个聊天应用程序并有一个用于创建消息的输入框。当我尝试创建一条消息时,它给了我这个错误:

    Object {
  "data": null,
  "errors": Array [
    Object {
      "locations": Array [
        Object {
          "column": 24,
          "line": 1,
          "sourceName": null,
        },
      ],
      "message": "Variable 'input' has coerced Null value for NonNull type 'ID!'",
      "path": null,
    },
  ],
}

这是我的输入组件:

type props = {
    chatRoomId: any
}

const Input = ({chatRoomId}: props) => {
    const [userId, setUserId] = useState(null);
    const [message, setMessage] = useState('');

    useEffect(() => {
        const fetchUser = async () => {
            const userInfo = await Auth.currentAuthenticatedUser();
            setUserId(userInfo.attributes.sub);
        }
        fetchUser();
        console.log("userID1:", userId)
    }, [])

    console.log("userID2:", userId)

    const onSendPress = async () => {
        try {
            console.log("userID3:", userId)
            await API.graphql(
                graphqlOperation(
                    createMessage, {
                        input: {
                            content: message,
                            userID: userId,
                            chatRoomID: chatRoomId
                        }
                    }
                )
            )
        } catch (e) {
            console.log(e);
        }
        setMessage('');
    }
    return (
        <View style={styles.container}>
            <TextInput
                placeholder='Type your message...'
                value={message}
                onChangeText={setMessage}
                style={styles.input}
            />
            <View style={styles.iconContainer}>
                <TouchableOpacity onPress={onSendPress}>
                    <Ionicons name='ios-send' color='#FFF' size={25} style={styles.icon}/>
                </TouchableOpacity>
            </View>
        </View>
    )
}
export default Input;

当我在控制台记录 ID 时,我得到了正确的 ID,但是当我发送它时似乎没有使用 ID。我的 graphql 架构是:

    type User @model {
  id: ID!
  name: String!
  dob: String!
  imageUri: String
  chatRoomUser: [ChatRoomUser] @connection(keyName: "byUser", fields: ["id"])
}

type ChatRoomUser
@model
@key(name: "byUser", fields: ["userID", "chatRoomID"])
@key(name: "byChatRoom", fields: ["chatRoomID", "userID"]) {
  id: ID!
  userID: ID!
  chatRoomID: ID!
  user: User @connection(fields: ["userID"])
  chatRoom: ChatRoom @connection(fields: ["chatRoomID"])
}

type ChatRoom @model {
  id: ID!
  chatRoomUsers: [ChatRoomUser] @connection(keyName: "byChatRoom", fields: ["id"])
  messages: [Message]  @connection(keyName: "byChatRoom", fields: ["id"])
  lastMessageID: ID!
  lastMessage: Message @connection(fields: ["lastMessageID"])
}

type Message
@model
@key(
  name: "byChatRoom",
  fields: ["chatRoomID", "createdAt"],
  queryField: "messagesByChatRoom") {
  id: ID!
  createdAt: String!
  content: String!
  userID: ID!
  chatRoomID: ID!
  user: User @connection(fields: ["userID"])
  chatRoom: ChatRoom @connection(fields: ["chatRoomID"])
}

我在这里大致遵循 github 的教程:https ://github.com/Savinvadim1312/WhatsappClone

因此,如果有人可以帮助我指出我可以改变的任何事情,那就太好了!谢谢!

标签: amazon-web-servicesreact-nativegraphqlaws-amplifyaws-appsync

解决方案


推荐阅读