node.js - 使用删除路由器删除文件夹内的文件 - Node.Js

标签 node.js express handlebars.js fs

我正在开发一个 Node.Js 应用程序,用户可以在其中上传和删除文件。

在我的“app.delete”路由器上,我尝试传递文件的 ID 和默认名称。 “ID”参数用于从数据库中删除对象,默认名称用于通过 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">&#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">&#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:\Users\paulo\Documents\Workspaces\Visual Studio Code\WelcomeScreenCinq\uploads\:videoName']
  errno: -4058,
  code: 'ENOENT',
  syscall: 'unlink',
  path:
   'C:\\Users\\paulo\\Documents\\Workspaces\\Visual Studio Code\\WelcomeScreenCinq\\uploads\\:videoName' }

我的数据库中的所有内容都已正确删除,但图像本身并未从我的上传文件夹中删除。

我做错了什么?

最佳答案

问题出在您的 AJAX 请求中。快速路由 URL 内的 :variables 是数据参数。您实际上并没有传递任何数据,而是传递了无用的参数。

所以,您的 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!');
            }
        })

提示一下,您不需要将该 ScreenImage 名称传递到路由中。 ID 应足以识别要删除的资源,因为您应该在使用唯一标识符上传文件时重命名文件,否则当其他人上传具有该名称的文件时,您会遇到问题。

关于node.js - 使用删除路由器删除文件夹内的文件 - Node.Js,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55766622/

相关文章:

javascript - Node 进程如何工作?

javascript - Mongoose.js 通过一次 connect() 调用创建与 MongoDB 的多个连接

Node.js Express 中间件 : app. 参数与 app.use

ember.js - 在动态位置插入部分/组件

handlebars.js - 在 Assemble 中使用模板继承

node.js - Node 安装错误

node.js - 为什么我的 Cypress Post 请求的请求正文为空?

javascript - 如何在 SPA 中使用 nodejs 应用程序和中间件重定向到主页?

node.js - 如何在socket.io的房间中从客户端调用函数?

node.js - 无法使用 nvm 更改 Node 版本