• 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

VPS Starter Arubacloud
0 głosów
281 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 (605,260 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 (605,260 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 (605,260 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 103 wizyt
0 głosów
0 odpowiedzi 249 wizyt
pytanie zadane 27 września 2019 w JavaScript przez DanexZ Obywatel (1,270 p.)
+2 głosów
2 odpowiedzi 653 wizyt

93,031 zapytań

141,995 odpowiedzi

321,300 komentarzy

62,379 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

Wprowadzenie do ITsec, tom 2

Można już zamawiać tom 2 książki "Wprowadzenie do bezpieczeństwa IT" - będzie to około 650 stron wiedzy o ITsec (17 rozdziałów, 14 autorów, kolorowy druk).

Planowana premiera: 30.09.2024, zaś planowana wysyłka nastąpi w drugim tygodniu października 2024.

Warto preorderować, tym bardziej, iż mamy dla Was kod: pasja (użyjcie go w koszyku), dzięki któremu uzyskamy dodatkowe 15% zniżki! Dziękujemy zaprzyjaźnionej ekipie Sekuraka za kod dla naszej Społeczności!

...