[Ошибка GraphQL]: Сообщение: невозможно деструктурировать свойство «id» из «undefined» или «null»., Местоположение: [объектный объект], путь: newMessage - PullRequest
0 голосов
/ 03 ноября 2019

Я новичок в хуках React / Apollo и пытаюсь попрактиковаться с этой концепцией, чтобы лучше ее понять.

Поэтому я попытался протестировать ее с React-Native-Gifted-Chat и Apollo Client.

Запрос и мутация работают очень хорошо, за исключением подписки.

Изображение приложения после того, как я закомментировал subscribeToMore () в useEffect (), это статические данные

У меня проблемы с хуком useSubscription, он застрянет в состоянии загрузки. Поэтому я попробовал другой метод, используя метод subscribeToMore в перехватчике useQuery.

Теперь начинается проблема, я хотел обновлять данные всякий раз, когда кто-то отправляет сообщение в чат, и это ошибка, котораяЯ получаю до сих пор.

[Ошибка GraphQL]: Сообщение: Невозможно деструктурировать свойство id из 'undefined' или 'null'., Местоположение: [объект Object], Путь: newMessage -node_modules / expo / build / environment / muteWarnings.fx.js: 18: 23 in warn - ... еще 17 стековых фреймов из внутренних компонентов фреймворка

Вот код для моего React Native Project

App.js

import React, { Suspense } from 'react';
import { StyleSheet, Text, View } from 'react-native';
import { NativeRouter, Route, Link } from "react-router-native";
import ApolloClient from 'apollo-boost';

import { ApolloProvider } from '@apollo/react-hooks';

import Home from './screens/ChatScreen';

const client = new ApolloClient({
  uri: 'http://192.168.1.110:4000',
});

export default function App() {

  return (
    <ApolloProvider client={client}>
      <NativeRouter>
          <Route exact path="/" component={Home} />
      </NativeRouter>
    </ApolloProvider>
  )
}

ChatScreen.js

import React, { useState, useEffect, useCallback } from 'react';
import { StyleSheet, Text, View, Platform, KeyboardAvoidingView } from 'react-native';
import { GiftedChat } from 'react-native-gifted-chat'
import { gql } from "apollo-boost";
import { useQuery, useMutation, useSubscription } from '@apollo/react-hooks';

const GET_MESSAGES = gql`
    query Messages($roomId: String!){
        getMessages(roomId: $roomId) {
            id
            user_id
            room_id
            parts {
                content
                type
            }
            created_at
            updated_at
        }
    }
`;

const SUBSCRIBE_MESSAGES = gql`
    subscription SubMessage($roomId: String!) {
        newMessage(roomId: $roomId) {
            id
            user_id
            room_id
            parts {
                content
                type
            }
            created_at
            updated_at
        }
    }
`;

const SEND_MESSAGE = gql`
    mutation SendMessage($roomId: String!, $text: String!) {
        sendMessage(room_id:$roomId, text: $text)
    }
`;

export default function ChatScreen() {
    const [messages, setMessages] = useState([]);
    const { loading, data, subscribeToMore } = useQuery(GET_MESSAGES, {
        variables: {
            roomId: "47dfe0eb-2bfb-43ac-bbdb-1c684d16d78a"
        }
    });

    const [addMessage, { data: mutationData }] = useMutation(SEND_MESSAGE);

    useEffect(() => {
        let messageList = [];
        if (data && data.getMessages) {
            data.getMessages.map(message => {
                messageList.push({
                    _id: message.id,
                    text: message.parts[0].content,
                    createdAt: message.created_at,
                    user: {
                        _id: message.user_id,
                        name: message.user_id,
                        avatar: 'https://placeimg.com/140/140/any',
                    },
                })
            })
        }

        setMessages([
            ...messageList
        ]);

        subscribeToMore({
            document: SUBSCRIBE_MESSAGES,
            variables: {
                roomId: "47dfe0eb-2bfb-43ac-bbdb-1c684d16d78a"
            },
            updateQuery: (previousResult, { subscriptionData }) => {
                console.log(subscriptionData)
            }
        });

        }, [data]);

        onSend = (msgs = []) => {

            addMessage({
                variables: {
                    roomId: "47dfe0eb-2bfb-43ac-bbdb-1c684d16d78a",
                    text: msgs[0].text
                }
            });

            setMessages(GiftedChat.append(messages, msgs))
        }

        if (loading) {
            return (
                <View style={styles.container, { justifyContent: 'center', alignItems: 'center'}}>
                    <Text>Loading....</Text>
                </View>
            )
        }

        return (
            <View style={styles.container}>
                <GiftedChat
                    messages={messages}
                    onSend={msg => onSend(msg)}
                    user={{
                        _id: 'test',
                    }}
                />
                {
                    Platform.OS === 'android' && <KeyboardAvoidingView behavior="padding" />
                }
            </View>
        )
    }

const styles = StyleSheet.create({
        container: {
            flex: 1
        },
    });
...