Удалить файл внутри папки с помощью delete router — Node.Js

#node.js #express #handlebars.js #fs

#node.js #экспресс #handlebars.js #фс

Вопрос:

Я работаю над узлом.Js-приложение, в котором пользователь может загружать и удалять файлы.

На моем маршрутизаторе «app.delete» я пытаюсь передать идентификатор и имя файла по умолчанию. Аргумент ‘ID’ используется для удаления объекта из базы данных, а имя по умолчанию используется для удаления изображения из папки «Мои загрузки» с помощью метода name with unlink.

Вот мой ‘app.js ‘:

 app.delete('/api/delete_welcome_screen_image/:id/:imageName', (req, res) => {
    fileStream.unlink('./uploads/'   req.params.imageName, err => {
        console.log(err);
    })

    ScreenImage.deleteOne(req.params._id)
    .then((screenImage) => {
        res.status(200).send(screenImage);
    })
    .catch(err => res.status(500).send(err));
})

 

…мой файл HBS с моими кодами HTML и JavaScript:

 
{{#each images}}
   <tr>
      <td>{{this.company}}</td>
      <td>{{this.date}}</td>
      <td>{{this.activated}}</td>
      <td>{{this.wsType}}</td>
      <td>
        <a href="/edit_welcome_screen_image/{{this.id}}" class="edit" title="Edit" data-toggle="tooltip"><i class="material-icons">amp;#xE254;</i></a>
        <a class="deleteImage" title="Delete" data-toggle="tooltip" href="/api/delete_welcome_screen_image/{{this.id}}/{{this.imageName}}"><i class="material-icons">amp;#xE872;</i></a>
      </td>
   </tr>
{{/each}}

$('.deleteImage').click((e) => {
        e.preventDefault();

        let confirmation = confirm("Are you sure about this?");

        if (confirmation === true) {
            $.ajax({
                type:'DELETE',
                url: '/api/delete_welcome_screen_image/:id/:imageName',
                contentType: 'application/json',
                success: (data) => {
                    alert('Welcome Screen deleted successfully!');
                    window.location.href = "/welcome_screens_list"
                },
                error: () => {
                    alert('An issue has occurred!');
                }
            })
        }
    })

 

Это ошибка, которую я получаю:

 
{ [Error: ENOENT: no such file or directory, unlink 'C:UserspauloDocumentsWorkspacesVisual Studio CodeWelcomeScreenCinquploads:videoName']
  errno: -4058,
  code: 'ENOENT',
  syscall: 'unlink',
  path:
   'C:\Users\paulo\Documents\Workspaces\Visual Studio Code\WelcomeScreenCinq\uploads\:videoName' }

 

Из моей базы данных все удалено правильно, но само изображение не удалено из моей папки загрузок.

Что я делаю не так?

Комментарии:

1. В вашем вызове Ajax вы буквально отправляете DELETE /api/delete_welcome_screen_image/:id/:imageName т.Е. Вы не заменяете свои параметры URL перед отправкой запроса

Ответ №1:

Проблема в вашем запросе AJAX. Переменные : внутри URL-адреса экспресс-маршрута являются параметрами для данных. На самом деле вы не передаете никаких данных, вы передаете бесполезные параметры.

Итак, ваш AJAX-запрос должен быть чем-то вроде

             const id = //GET ID WITH jQUERY
            const imageName = //GET NAME WITH JQUERY
            $.ajax({
            type:'DELETE',
            url: `/api/delete_welcome_screen_image/${id}/${imageName}`,
            contentType: 'application/json',
            success: (data) => {
                alert('Welcome Screen deleted successfully!');
                window.location.href = "/welcome_screens_list"
            },
            error: () => {
                alert('An issue has occurred!');
            }
        })
 

Просто совет, вам не нужно указывать это имя экранного изображения в маршруте. Идентификатора должно быть достаточно, чтобы идентифицировать удаляемые ресурсы, потому что вы должны переименовывать файлы при их загрузке с уникальным идентификатором, иначе у вас возникнут проблемы, когда кто-то другой загрузит файл с таким именем.

Комментарии:

1. Привет, Сэм! Большое вам спасибо за вашу помощь. Это сработало! Я неправильно понял, как работает Ajax-запрос, но теперь, с вашей помощью, я смог лучше понять, как это работает. А также, спасибо за ваш совет, я только что внес изменения только с идентификатором, и теперь это намного лучше. Приветствую.