fs unlink无法找到所需的路径

时间:2017-04-04 14:33:58

标签: node.js express

我在expressjs中有以下删除功能,但是当我尝试使用我要删除的元素的路径时,它显示为未定义但我修改了教程但仍然没有看到问题所在:

router.delete('/messagedelete/:empId', function (req, res) {

  Message.remove({empId: req.params.empId}, function(err, message) {
      console.log(message.path);
      console.log("got inside");
    if(err) { 
       return res.send({status: "200", response: "fail"});
    }
      console.log(message.path);
    fs.unlink(message.path, function() {
      res.send ({
        status: "200",
        responseType: "string",
        response: "success"
      });     
    });
 }); 
});

我在文件顶部导入这样的fs:

const fs = require('fs');

1 个答案:

答案 0 :(得分:1)

有两个主要问题:

  1. 您没有处理错误
  2. 您不会检查哪些文件会被删除
  3. 改变这个:

    fs.unlink(message.path, function() {
      res.send ({
        status: "200",
        responseType: "string",
        response: "success"
      });     
    });
    

    为:

    fs.unlink(message.path, function (err) {
      if (err) {
        // handle the error - like res.send with status 500 etc.
      }
      res.send ({
        status: "200",
        responseType: "string",
        response: "success"
      });     
    });
    

    你没有包含任何信息message.path的价值是什么,但如果你不是100%确定你知道路径是什么,那么你永远不应该删除任何东西。在这里,你的程序真的不知道它是什么试图删除 - 它可能是它自己的源代码或系统上的一些其他重要文件,我们都知道。

    您应该使用path.join()加入一些您要删除文件的前缀和您获得的message.path,例如:

    let filePath = path.join(dir, message.path);
    

    其中dir是您要保留要删除的文件的位置 - 如果您不这样做,那么您可能正在删除整个文件系统上的文件。但这还不够,你实际上必须检查filePath中的结果是否不在dir之外,如果message.path包含..,那么结果可能就是if (filePath.indexOf(dir + path.sep) !== 0) { return res.status(403).end('Forbidden'); } 。所以你还需要例如:

    path.join

    有关验证您使用import { INTEGER, STRING, DATE } from 'sequelize'; import sequelize from '../sequelize'; import Task from './task.model' const ProjectModel = sequelize.define('project', { project_id: { type: INTEGER, primaryKey: true, autoIncrement: true }, phabricator_project_id: { type: STRING, allowNull: false }, name: { type: STRING }, description: { type: STRING }, start_date: { type: STRING, }, end_date: { type: STRING } }, { timestamps: false } ); export default ProjectModel; 撰写的路径的更多示例和更多详细信息,请参阅此答案以及为什么它很重要: