我有以下文档架构
const categorySchema = new Schema({
category_id: { type: Number, required: true, unique: true },
name: { type: String, required: true, unique: true },
icon_url: { type: String, required: true },
})
删除文件的方法
deleteSingle(fileNameWithPath: string) {
fs.unlink(fileNameWithPath, function(err) {
if(err && err.code == 'ENOENT') {
console.info("File doesn't exist");
} else if (err) {
console.error("Error occurred while trying to remove file");
} else {
console.info('File has been removed');
}
});
}
我可以使用以下方法删除文档,但也不知道如何使用上述deleteSingle()
方法删除文件。
router.delete('/:category', async (req, res) => { // removes the category
try {
let category = await CategorySchema
.findOneAndRemove({
category_id: req.params.category
}
}
})
path
for image是根目录中的文件夹uploads
。因此它就像这样'uploads/image.png'
删除包含文件的文档的任何建议。
答案 0 :(得分:1)
findOneAndRemove()
方法将返回正在删除的文档,因此您只需使用icon_url
属性即可传递实际文件的相对路径。
但是你的包装功能在这里没什么用,因为它在回调中使用了分辨率。相反,使用带有Promise的东西。 mz
库已经使用Promises包装fs
和其他内置库:
const fs = require('mz/fs');
const path = require('path');
router.delete('/:category', async (req, res) => { // removes the category
try {
let category = await CategorySchema.findOneAndRemove({
category_id: req.params.category
});
await fs.unlink(path.resolve(__dirname, category.icon_url));
// then send response
} catch(e) {
// handle error responses here
}
})
或者您可以自己将标准fs.unlink
包装在承诺中:
const fs = require('fs');
const path = require('path');
router.delete('/:category', async (req, res) => { // removes the category
try {
let category = await CategorySchema.findOneAndRemove({
category_id: req.params.category
});
await new Promise((resolve,reject) =>
fs.unlink(path.resolve(__dirname, category.icon_url),(err) =>
(err) ? reject(err) : resolve())
);
// then send response
} catch(e) {
// handle error responses here
}
})
注意 - 首先,您应该使用
findOneAndDelete()
代替现代API。该方法实际上使用官方API调用,而不是findAndModify
方法所使用的findOneAndRemove()
已弃用的直接使用。