Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/453.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript NodeJS&;Multer:如果出现错误,请停止上载文件_Javascript_Node.js_File Upload_Upload_Multer - Fatal编程技术网

Javascript NodeJS&;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

您好,我正在使用Node&Multer创建文件上载,它可以工作,但问题是,若出现错误(比如用户并没有填写其他字段),它仍然会上载我不想要的文件

我真的不知道该怎么做,因为我是第一次这么做,所以希望有人能有这样的经验。这是我的密码

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的错误处理程序,例如表单填写不正确