NodeJS (Express) - маршрут app.delete не работает - PullRequest
0 голосов
/ 15 декабря 2018

Работа над пониманием основ CRUD с настройкой простых маршрутов из моего документа HTML5 в базу данных Postgres.Мои кнопки GET и POST работают, но мой DELETE не удаляется из моей базы данных.Я понимаю, что все маршруты выглядят очень похоже (и попытался переименовать их, чтобы увидеть, попадет ли она в функцию обратного вызова, связанную с базой данных, но она не работает).Может кто-нибудь сказать мне, почему моя форма HTML5 не работает с моим маршрутом для достижения базы данных для удаления?Спасибо!

Я включу только тот код, на который я ссылаюсь, так как у меня весь другой код работает хорошо.Сначала начнем с показа дрянного HTML, затем index.js с маршрутами, а затем query.js с запросами к базе данных.(////// Отдельные документы, где вытащен код :))

 <h1>Let's DELETE ONE Human</h1>
    <form action="/users/:id" method="delete">
        ID:<input type="number" name="id">
        <input type="submit" name="">
    </form>

    /////////////////////////////////////////////////////////////////

    app.get('/', (request, response) => {
      response.sendFile(path.join(__dirname + '/html/homepage.html'))
    }, db.getUsers)

    app.get('/newHuman.html', (request, response) => {
      response.sendFile(path.join(__dirname + '/html/newHuman.html'))
    })
    app.get('/users', db.getUsers)
    app.get('/users/:id', db.getUserById)
    app.post('/users', db.createUser)
    app.put('/users/:id', db.updateUser)
    app.delete('/users/:id', db.deleteUser)

    app.listen(port, () => {
      console.log(`App running on port ${port}.`)
    })
  ////////////////////////////////////////////////////////////////////////

const deleteUser = (request, response) => {
      const id = parseInt(request.query.id)

      pool.query('DELETE FROM users WHERE id = $1', [id], (error, results) => {
        if (error) {
          throw error
        }
        response.status(200).send(`User deleted with ID: ${id}`)
      })
    }

TL; DR
Как отправить по правильному маршруту (даже спросто дважды (с помощью POSTing) из моего HTML, когда app.delete и app.put имеют одинаковый маршрут?Пробовал переименовывать маршрут, не сработало, но я знаю, что вам не нужно переименовывать, чтобы он работал.Вот маршруты:

app.put (' / users /: id ', db.updateUser) app.delete (' / users /: id ',db.deleteUser)

Ответы [ 2 ]

0 голосов
/ 17 декабря 2018

Еще один более простой способ сделать это - использовать модуль npm с именем переопределение метода .

В файле основной точки входа для вашего сервера добавьте следующееСтроки:

const express = require('express');
const app = express();
const methodOverride = require('method-override');
app.use(methodOverride('_method'));

Теперь в вашей HTML-форме вы можете легко использовать запросы PUT или DELETE: Например:

    <h1>Let's DELETE ONE Human</h1>
<form id='myFormId' action="/users/:id?_method=DELETE" method="delete">
    ID:<input type="number" name="id" id='deleteId'>
    <input type="submit" name="">
</form>

Обратите внимание на атрибут действия формы, всетеперь вам нужно добавить эту простую строку, и все готово!

0 голосов
/ 15 декабря 2018

Метод HTML-формы поддерживает только GET и POST метод.

Либо вам нужно использовать GET или POST, либо вы можете использовать ajax или какую-либо библиотеку, например request или axios , чтобы сделать запрос DELETE.

Например, если вы используете axios, попробуйте следующий код.

Игнорировать импорт jQuery и axios, если вы уже импортировали их.

<!-- import jQuery -->
<script
  src="https://code.jquery.com/jquery-3.3.1.js"
  integrity="sha256-2Kok7MbOyxpgUVvAk/HJ2jigOSYS2auK4Pfzbm7uH60="
  crossorigin="anonymous"></script>
<!-- import axios -->
<script src="https://unpkg.com/axios/dist/axios.min.js"></script>


<h1>Let's DELETE ONE Human</h1>
<form id='myFormId' action="/users/:id" method="delete">
    ID:<input type="number" name="id" id='deleteId'>
    <input type="submit" name="">
</form>


<script>
    $( document ).ready(function() {
        const myForm = $('#myFormId');
        myForm.submit((event) => {
            event.preventDefault();
            const id = $('#deleteId').val();
            const url = `/users/${id}`;
            axios.delete(url)
                .then(function (response) {
                    console.log(response);
                })
                .catch(function (error) {
                    console.log(error);
                });
        });
    });
</script>
...