Sails.js无法删除记录及关联上传文件问题求助
问题分析与修复方案
先帮你梳理代码里的几个关键问题,这些大概率就是导致删除失败的原因:
1. 文件路径拼接错误
你当前的文件路径写法会导致路径格式异常:
fs.unlink("./assets/video"+video, function(err1){...})
比如video值是test.mp4的话,最终路径会变成./assets/videotest.mp4,系统根本找不到对应文件。要在video前加上斜杠,或者用更可靠的path模块拼接:
// 手动补全斜杠的写法 fs.unlink("./assets/video/"+video, function(err1){...}) // 更推荐的path模块写法(需先引入const path = require('path')) fs.unlink(path.join(__dirname, '../assets/video', video), function(err1){...})
2. 错误处理变量混淆
在文件删除的回调里,你打印的是数据库删除的错误err,而不是文件删除的真实错误err1:
if(err1){ console.log(err); }
这会让你看不到文件删除环节的真实报错,改成:
if(err1){ console.log('文件删除失败:', err1); }
3. 逻辑顺序不合理
你现在不管数据库删除成功与否,都会执行文件删除操作,很容易造成数据不一致(比如数据库删失败了,但文件被删掉了)。应该把文件删除逻辑放在数据库删除成功的分支里:
Kue_screen.destroy({id:req.param('id')}).exec(function(err){ if(err){ console.log('数据库删除失败:', err); req.addFlash('error', '删除失败,请重试'); return res.redirect('/setting/choose'); } // 数据库删除成功后再执行文件删除 fs.unlink("./assets/video/"+video, function(err1){ if(err1){ console.log('文件删除失败:', err1); req.addFlash('warning', '数据库记录已删除,但关联文件删除失败'); } else { req.addFlash('success', 'video has been deleted'); // 这里你之前拼写错了vdieo } res.redirect('/setting/choose'); }); });
4. 拼写错误
你的成功提示里把video拼成了vdieo,修正后才不会显示错误的提示文本。
额外优化建议
- 不要直接用请求参数里的
video值来删除文件,建议先从数据库查询到对应记录,拿到真实的文件名再执行删除,避免请求参数被篡改导致误删文件。 - 可以改用
fs.promises.unlink配合async/await写法,减少回调嵌套,让代码更易维护。
内容的提问来源于stack exchange,提问作者Max13
相关产品推荐
相关产品推荐

