美文网首页前端中的函数式编程最佳实践
使用R.allPass/anyPass 避免验证多条件的If 语

使用R.allPass/anyPass 避免验证多条件的If 语

作者: 竹杖芒鞋轻胜码 | 来源:发表于2019-03-31 11:30 被阅读0次

    Node:
    实现以下一段验证类型的函数,
    主要检验:

    1. 以及此文件是否存在
    2. 上传的文件是否为xlsx文件格式
    3. 文件大小<8M
    4. 前端中上传的表单name为 'xlsxfile'的文件

    只有当条件均符合时才能通过校验返回True值。

    前提已知

    1. 使用multer中间件,上传的 file返回数据结构为:
        # 
        const file = {
          fieldname: 'xlsxfile',
          originalname: 'Y~Z.xlsx',
          encoding: '7bit',
          mimetype:
            'application/vnd.openxmlformats-officedocument.spreadsheetml.sheet',
          destination: 'D:\\Code\\upload_TEMP',
          filename: 'data.xlsx',
          path: 'D:\\Code\\upload_TEMP\\data.xlsx',
          size: 9848,
        };
    

    一般写法

    1. 憋一口气的写法:
    import {existsSync} from 'fs';
    
    const validate =(file)=>{
        const xlsxMIME =
        'application/vnd.openxmlformats-officedocument.spreadsheetml.sheet';
    
        if(existsSync(file)&&file.mimetype===xlsxMIME&&file.size<=8*1024*1024&&file.fieldname!=='xlsxfile'){
            return true;
        }
        return false;
    }
    
    1. n连发if判断写法:
    import {existsSync} from 'fs';
    
    const validate =(file)=>{
        const xlsxMIME =
        'application/vnd.openxmlformats-officedocument.spreadsheetml.sheet';
    
        if(!existsSync(file)){
            return false;
        }
    
        if(file.mimetype!==xlsxMIME){
            return false;
        }
    
        if(file.size>=8*1024*1024){
            return false;
        }
    
        if(file.fieldname!=='xlsxfile'){
            return false;
        }
        return true;
    }
    
    

    优雅的写法

    使用 R.allPass 方法

    import { existsSync } from 'fs';
    
    const validate = (file) => {
      const xlsxMIME =
        'application/vnd.openxmlformats-officedocument.spreadsheetml.sheet';
      const validRules = [
        (file) => existsSync(file.path),
        (file) => file.mimetype === xlsxMIME,
        (file) => file.size<=8*1024*1024,
        (file) => file.fieldname === 'xlsxfile'
      ];
      return R.allPass(validRules)(file);
    };
    

    相关文章

      网友评论

        本文标题:使用R.allPass/anyPass 避免验证多条件的If 语

        本文链接:https://www.haomeiwen.com/subject/ojuybqtx.html