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

NodeJS i MongoDB - obsługa usuwania elementu

Object Storage Arubacloud
0 głosów
208 wizyt
pytanie zadane 7 czerwca 2020 w JavaScript przez Allen Obywatel (1,010 p.)

Chcę usunąć element z mongodb. Pojawia się następujący błąd i nie mam pojęcia co może być nie tak:

router.delete('/library/:id', (req, res) => {
  console.log(req.params.id);
  Book.deleteOne({ _id: req.params.id }, (err) => {
    if(err) console.log(err);
  });
  res.redirect('library');
});
<form action="/library/<%= book._id %>" method="DELETE" class="delete-btn-form">
                <div class="delete-btn"></div>
</form>

Id jest poprawnie wyświetlane w konsoli w 2 inii.

komentarz 7 czerwca 2020 przez ScriptyChris Mędrzec (190,190 p.)
Wstaw proszę wyraźniejszy screen lub pokaż te błędy w formie tekstu.
komentarz 7 czerwca 2020 przez Allen Obywatel (1,010 p.)
GET http://localhost:5000/library/5ed9f56036f81d215c4ea5cd? 404 (Not Found).

Dwa poniższe błędy odnoszą się do innego zagadnienia (ładowania zdjęcia).
komentarz 7 czerwca 2020 przez ScriptyChris Mędrzec (190,190 p.)

Czy serwer na pewno nasłuchuje na porcie 5000 i jest uruchomiony? Jeśli korzystasz z expressa, to wydaje mi się, że metoda delete nasłuchuje na request właśnie DELETE, a nie GET.

1 odpowiedź

+1 głos
odpowiedź 7 czerwca 2020 przez Comandeer Guru (601,590 p.)

Jeśli router nasłuchuje na metodę DELETE, to nie obsłuży formularza wysłanego metodą GET (bo ta metoda jest używana, jeśli formularz ma atrybut [method] o nieznanej wartości). NIestety, z poziomu przeglądarki takie żądanie da się wysłać tylko Ajaksem, formularze nie mają takiej możliwości.

komentarz 8 czerwca 2020 przez Allen Obywatel (1,010 p.)

Jak mam to zrobi używając metody post? Zrobiłem coś takiego i w konsoli poprawnie wyświetla się "Delete route", a strona przeładowuje się bez błędów. Problem w tym że dokument nie jest usuwany z bazy.

router.delete('/delete/:id', (req, res) => {
  console.log('Delete route');
  Book.findOneAndDelete({ _id: req.params.id }, (err) => {
    if (err) console.warn(err);
  });
    res.redirect('/library');
});
<form action="/delete/<%= book._id %>?_method=DELETE" method="POST" class="delete-btn-form">
                <div class="delete-btn"></div>
</form>

 

komentarz 8 czerwca 2020 przez Comandeer Guru (601,590 p.)

Hmm, tak szczerze to nie powinno się wyświetlać "delete route", bo router nie powinien nawet przechwytywać tego żądania.

Dodatkowo robisz przekierowanie zanim książka zostanie usunięta z bazy. Powinieneś robić przekierowanie wewnątrz callbacku:

router.delete('/delete/:id', (req, res) => {
  console.log('Delete route');
  Book.findOneAndDelete({ _id: req.params.id }, (err) => {
    if (err) console.warn(err);
    res.redirect('/library');
  });
});

 

komentarz 8 czerwca 2020 przez Allen Obywatel (1,010 p.)
Faktycznie nie zauważyłem przekierowania w złym miejscu, jednak nadal to nie pomaga. Dlaczego router nie powinien przechwycić żądania? Używam method-override i rozumiem, że podczas wykonywania metody post z tagu form, zostaje ona nadpisana i express obsługuje delete.
komentarz 8 czerwca 2020 przez Comandeer Guru (601,590 p.)

Faktycznie, jest taki mechanizm.

Więc jedyne, co mi przychodzi do głowy, to złe id przekazywane w URL-u.

komentarz 8 czerwca 2020 przez Allen Obywatel (1,010 p.)
Id wypisane do konsoli jest identyczne jak w bazie danych. No nic będę dalej szukał błędu. Dzięki za poświęcony czas.

Podobne pytania

0 głosów
0 odpowiedzi 100 wizyt
0 głosów
0 odpowiedzi 226 wizyt
pytanie zadane 27 września 2019 w JavaScript przez DanexZ Obywatel (1,270 p.)
+2 głosów
2 odpowiedzi 614 wizyt

92,584 zapytań

141,434 odpowiedzi

319,669 komentarzy

61,967 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!

...