我正在开发一个Node.js应用程序,用户可以在其中上传和删除文件。
在我的"app.delete"路由器上,我正在尝试传递文件的ID和默认名称。"ID"参数用于从数据库中删除对象,默认名称用于通过带有取消链接方法的名称从我的上传文件夹中删除图像。
这是我的"应用程序.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"></i></a>
<a class="deleteImage" title="Delete" data-toggle="tooltip" href="/api/delete_welcome_screen_image/{{this.id}}/{{this.imageName}}"><i class="material-icons"></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' }
我的数据库的所有内容都正确删除,但图像本身不会从我的上传文件夹中删除。
我做错了什么?
问题出在您的 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!');
}
})
只是一个提示,您无需将该屏幕图像名称交到路由中。该 ID 应该足以标识要删除的资源,因为当文件使用唯一标识符上传文件时,您应该重命名文件,否则当其他人上传具有该名称的文件时,您将遇到问题。