删除节点js

时间:2018-06-03 10:27:32

标签: node.js mongoose

我有以下文档架构

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'

删除包含文件的文档的任何建议。

1 个答案:

答案 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()已弃用的直接使用。