• Najnowsze pytania
  • Bez odpowiedzi
  • Zadaj pytanie
  • Kategorie
  • Tagi
  • Zdobyte punkty
  • Ekipa ninja
  • IRC
  • FAQ
  • Regulamin
  • Książki warte uwagi

GraphQL zwraca null mimo że ID nie jest puste

Object Storage Arubacloud
0 głosów
166 wizyt
pytanie zadane 11 kwietnia 2021 w SQL, bazy danych przez Davidelo18 Użytkownik (660 p.)

Cześć ;)
Jestem w trakcie tworzenia apki w stylu social media. Mam w swojej BD (MongoDB) tabelę z komentarzami i jednym polem jest "replies" gdzie daję odpowiedzi na ten konkretny komentarz. W BD wszystko jest spoko, jak widać się tworzy nowe id i wgl. Niestety GraphQL zwraca null dla id:



Kod modelu Comment:

const { model, Schema } = require('mongoose');

const commentSchema = new Schema({
    postId: {
        type: Schema.Types.ObjectId,
        ref: 'comments'
    },
    body: String,
    username: String,
    publishingTime: String,
    replies: [ this ],
    plusses: [
        {
            username: String,
            plussedAt: String
        }
    ],
    minusses: [
        {
            username: String,
            minussedAt: String
        }
    ],
    user: {
        type: Schema.Types.ObjectId,
        ref: 'users'
    }
});

module.exports = model('Comment', commentSchema);

 

Kod dodanie odpowiedzi do komentarza:

async postReplyToComment(parent, { commentId, body }, context) {
    const user = auth(context);

    if (body.trim() === '') {
        throw new UserInputError('Pusty komentarz', {
            errors: {
                body: "Komentarz nie może być pusty"
            }
        })
    }

    const comment = await Comment.findById(commentId);
    if (comment) {
        const newReply = new Comment({
            body,
            user: user.id,
            username: user.username,
            publishingTime: new Date().toISOString()
        });

        comment.replies.push(newReply);

        await comment.save();
        return comment;
    } else {
        throw new UserInputError('Nie znaleziono takiego komentarza');
    }
}

 

komentarz 11 kwietnia 2021 przez Tnifey Pasjonat (24,190 p.)
Do resolvera zwracasz obiekt z MongoID, a powinieneś zwracać string.
komentarz 11 kwietnia 2021 przez Davidelo18 Użytkownik (660 p.)
Gdzie konkretnie? W sensie comment powinienem skonwertować na stringa?
komentarz 11 kwietnia 2021 przez Tnifey Pasjonat (24,190 p.)
edycja 11 kwietnia 2021 przez Tnifey
@edit: odpowiedź jako odpowiedź :P

1 odpowiedź

+2 głosów
odpowiedź 11 kwietnia 2021 przez Tnifey Pasjonat (24,190 p.)
edycja 11 kwietnia 2021 przez Tnifey

hmm... zauważ, że w query w graphql playground masz pole id, a w mongoose/javascript w konsoli masz pole _id , czy resolver w graphql rozwiązuje Ci tę różnicę nazw? Ogólnie to pole replies zwraca tablicę z obiektami z mongodb, a Comment.findById zwraca instancję Model z getterem id :P Dlatego na parencie masz id, a na replies nie masz bo to czyste obiekty javascriptowe :P

Jak ogarnąłeś schema i resolvery w graphql?

Dodatkowo jeśli id w graphql zwraca Ci null, a nie błąd resolvera, to znaczy, że pole id masz ustawione na ID, a nie ID!, czyli może być nullable, a to chyba źle jeśli chodzi o wskaźnik zasobu.

Ze stackoverflow:

https://stackoverflow.com/a/58169175

https://mongoosejs.com/docs/guide.html#id

komentarz 11 kwietnia 2021 przez Davidelo18 Użytkownik (660 p.)
Tak, resolver rozwiązuje tę różnicę nazw. Zobacz że oryginalnie sam obiekt Comment też ma swoje id, a w replies po prostu tworzę nowy. Metoda getComments prawidłowo zwraca id komentarza-rodzica.

Co do wykrzyknika - to on tam był, tylko usunąłem go tymczasowo na rzecz debugowania właśnie :D

W każdym razie, mówisz by dać lepiej np. findOne zamiast findById?

Podobne pytania

0 głosów
2 odpowiedzi 363 wizyt
pytanie zadane 12 lipca 2020 w C# przez Sensej Użytkownik (540 p.)
+1 głos
1 odpowiedź 148 wizyt
pytanie zadane 1 września 2022 w JavaScript przez castor_fiber Użytkownik (800 p.)
0 głosów
1 odpowiedź 215 wizyt

92,570 zapytań

141,422 odpowiedzi

319,643 komentarzy

61,958 pasjonatów

Motyw:

Akcja Pajacyk

Pajacyk od wielu lat dożywia dzieci. Pomóż klikając w zielony brzuszek na stronie. Dziękujemy! ♡

Oto polecana książka warta uwagi.
Pełną listę książek znajdziesz tutaj.

Akademia Sekuraka

Kolejna edycja największej imprezy hakerskiej w Polsce, czyli Mega Sekurak Hacking Party odbędzie się już 20 maja 2024r. Z tej okazji mamy dla Was kod: pasjamshp - jeżeli wpiszecie go w koszyku, to wówczas otrzymacie 40% zniżki na bilet w wersji standard!

Więcej informacji na temat imprezy znajdziecie tutaj. Dziękujemy ekipie Sekuraka za taką fajną zniżkę dla wszystkich Pasjonatów!

Akademia Sekuraka

Niedawno wystartował dodruk tej świetnej, rozchwytywanej książki (około 940 stron). Mamy dla Was kod: pasja (wpiszcie go w koszyku), dzięki któremu otrzymujemy 10% zniżki - dziękujemy zaprzyjaźnionej ekipie Sekuraka za taki bonus dla Pasjonatów! Książka to pierwszy tom z serii o ITsec, który łagodnie wprowadzi w świat bezpieczeństwa IT każdą osobę - warto, polecamy!

...