我在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');
答案 0 :(得分:1)
有两个主要问题:
改变这个:
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;
撰写的路径的更多示例和更多详细信息,请参阅此答案以及为什么它很重要: