Obecnie próbuję napisać interfejs API w maszynach do przechowywania i pobierania jednostek z instancji Datastore Google Cloud.

Udało mi się zdobyć GET, POST, a DELETE działa, jednak działa moje PUT API, ale tworzy niechcianą własność po przetestowaniu połączenia API za pomocą Postana.

Oto kod połączenia API PUT, który jest kierowany na /api/offer/:id

export async function updateOffer(req: any, res: any) {
    try {
        const offerKey = datastore.key(["offer", datastore.int(req.params.id)]);
       
        var offer = await datastore.get(offerKey);
        
        if (req.body.status == null || req.body.status == undefined) {
            res.status(StatusCodes.BAD_REQUEST).send({
                message: "Offer could not be updated as `status` property was left empty",
                IsSuccess: false,
            });

            logger.error("Offer could not be updated as `status` property was left empty");   
        } else {
            offer.status = req.body.status;

            await datastore.merge({
                key: offerKey,
                data: offer
            });
    
            res.status(StatusCodes.OK).send({
                message: "Offer has been updated",
                IsSuccess: true,
                data: offer
            });
    
            logger.info("Offer has been updated");
        }

    } catch (e) {
        res.status(StatusCodes.BAD_REQUEST).send({
            message: "Unable to update offer",
            IsSuccess: false,
            error: JSON.stringify(e)
        });

        logger.error("Unable to update offer: " + e);
    }
}

Co robi kod, to pozwala na aktualizację jednej właściwości jednostki ofertowej, zwanej status. Dlatego metoda, której używam w tym rozmowie API, jest:

  1. Uzyskaj podmiot najpierw przez param :id
  2. Ustaw status jako nowy status określony w req.body.status
  3. Scal pierwotną jednostkę z nowym stworzonym podmiotem

Jednak stwarza niepożądaną własność, jak widać w tym zrzucie ekranu

An extra property called 0 gets created upon the merge

Jak widać na obrazie, dodatkowa nieruchomość 0 zostanie dodana do podmiotu, który składa się z reprezentacji JSON podmiotu. Nie jestem pewien, dlaczego tak się dzieje, a jeśli jest to nawet właściwy sposób, aby to zrobić.

0
Meowmi 28 październik 2020, 10:44

1 odpowiedź

Najlepsza odpowiedź

Datastore.get () Zwraca tablicę, więc po przekazaniu oferty jako parametr danych scalania jest to tablica, a nie podmiot. Dane podmiotowe, których szukasz, jest zatem w pozycji 0 tablicy, i dlatego otrzymasz nieruchomość o nazwie "0".

Możesz to naprawić, zmieniając swoje połączenie do {x0}}, jak sugerowano w https://cloud.google.com/datastore/docs/concepts/ENties#reRetRieving_an_entity.

1
Jim Morrison 29 październik 2020, 15:29