Javascript NodeJS&;Multer:如果出现错误,请停止上载文件
您好,我正在使用Node&Multer创建文件上载,它可以工作,但问题是,若出现错误(比如用户并没有填写其他字段),它仍然会上载我不想要的文件 我真的不知道该怎么做,因为我是第一次这么做,所以希望有人能有这样的经验。这是我的密码Javascript NodeJS&;Multer:如果出现错误,请停止上载文件,javascript,node.js,file-upload,upload,multer,Javascript,Node.js,File Upload,Upload,Multer,您好,我正在使用Node&Multer创建文件上载,它可以工作,但问题是,若出现错误(比如用户并没有填写其他字段),它仍然会上载我不想要的文件 我真的不知道该怎么做,因为我是第一次这么做,所以希望有人能有这样的经验。这是我的密码 const storage = multer.diskStorage({ destination: (req, file, callback) => { const userPath = path.join(imgStoragePath, req.u
const storage = multer.diskStorage({
destination: (req, file, callback) => {
const userPath = path.join(imgStoragePath, req.userId);
fs.mkdir(
userPath,
() => callback(null, userPath)
)
},
filename: (req, file, callback) => {
const filenameParts = file.originalname.split('.');
const ext = filenameParts.pop();
const basename = filenameParts.join('.');
const additionalPath = Date.now() + '' + uuid() + '' +
Math.floor(Math.random() * (2000 - 500)) + 500;
callback(null, basename + '-' + additionalPath + '.' + ext);
}
})
const upload = multer({
storage,
limits: '1mb'
})
router.post('/', upload.single('image'), async (req, res) => {
//code
})
如果发生错误,它应该返回错误消息并将其发送到服务器,停止代码执行,不做任何事情,它会这样做,但也会上载文件,我知道这会发生,因为upload
是中间件,中间件首先执行,我希望它能够阻止它。谢谢
app.post('/upload',[
multer({
dest : './uploads/',
onError : function(err, next) {
console.log('error', err);
next(err);
}
}),
function(req, res) {
res.status(204).end();
}
]);
//从multer docs查看此链接好的,因此multer并不真正负责验证表单输入,它的唯一目的是允许您将文件上载到后端。现在开始讨论你要解决的问题
- 您可以在前端进行html验证,以确保用户在提交表单之前填写所有
必需的
字段
- 您可以进行后端检查,以确保已填写所有必需的字段
export const setRequired = (...args: any): boolean => {
let isValid = true;
_.forEach(args, value => {
if (isUndefined(value)) isValid = false;
});
return isValid;
};
const isValid:any=setRequired(文件名、姓氏);
该函数使用typescript和lodash并检查指定的所有参数是否存在。因此,在后端执行任何操作之前,请将必填字段传递给函数,该函数将返回一个布尔值,以通知您是否已从前端接收到所有必填字段
关于multer的文件大小和文件类型错误的第二部分,您可以尝试以下内容
const storage=multer.diskStorage({
目的地(请求、文件、cb){
cb(null,path.join(uu dirname,`path_to_folder`));
},
文件名(请求、文件、cb){
const ext=path.extname(file.originalname.toLowerCase();
常量文件\u name=uuidv4()+“\uu”+ext;
cb(空,文件名);
},
});
const upload=multer({
存储
限制:{fileSize:2000000},//字节数:2000000字节=2 MB
文件过滤器(请求、文件、cb){
const ext=path.extname(file.originalname.toLowerCase();
if(ext!=“.png”&&ext!=”.jpg“&&ext!=”.jpeg”){
cb(新错误(“错误:不可接受的文件格式”),false;
}否则{
cb(null,true);
}
},
}).any();
router.post(“/”,(req,res)=>{
上传(请求、恢复、异步错误=>{
如果(错误){
控制台错误(err);
//上载时发生未知错误。
//err对象将包含multer错误的原因
}
if(请求文件和请求文件[0]){
//文件已保存
console.log(请求文件[0].filename);
}
});
},
);
您试图在此处处理哪些错误?例如,如果前端的表单包含文件上载和输入字段,并且用户仅通过上载文件而未填写输入来提交表单,那么在这种情况下,代码是否应返回错误响应?或者您正在尝试处理文件上载本身的错误,例如文件大小超过最大限制或文件类型不是指定的?我指的是第一种情况,当用户填写文件输入而没有填写其他输入时(但如果您有第二种情况的线索,我很高兴听到itconst setRequired只负责文件或每个输入?@ilia1它负责检查值是否存在,您可以随意传递它,如果您传递输入以及保存的文件,它将检查这些是否存在,如果不存在,它将返回false
。如果只有multer内部发生任何错误,则调用此errorHander,因此您可以在multer MiddlewareEyes之后编写中间件,但如果您阅读了我的问题,我提到我需要multer的错误处理程序,例如表单填写不正确