nodejs 后缀名判断限制代码


Posted in NodeJs onMarch 31, 2011

现状: 冗余
在web开发中,我们是否常常会使用不同的编程语言实现相同的功能?
如一个文件上传功能,需要对上传文件进行文件格式限制。我们通常会使用后缀名做限制。

前端
为了用户体验,会在页面对用户选择的文件进行判断,合法才让用户可以上传。

function is_filetype(filename, types) { 
types = types.split(','); 
var pattern = '\.('; 
for(var i=0; i<types.length; i++) { 
if(0 != i) { 
pattern += '|'; 
} 
pattern += types[i].trim(); 
} 
pattern += ')$'; 
return new RegExp(pattern, 'i').test(filename); 
}; // 此处省略N行代码 
if(!is_filetype($('#uploadfile').val(), 'doc,pdf,txt,wps,odf,md,png,gif,jpg')){ 
can_submit = false; // 不允许上传 
$('#uploadfile').val(''); 
alert('只允许上传: ' + constant.RESUME_FILETYPES); 
} 
// 此处省略N行代码

后端
由于担心恶意上传,无法避免地需要重新对用户上传的文件进行判断。于是我又用python写了一个判断文件后缀的逻辑
import re def is_filetype(filename, types): 
types = types.split(',') 
pattern = '\.(' + '|'.join([t.strip() for t in types]) + ')$'; 
return re.search(pattern, filename, re.I) != None 
# web request handler 
# 此处省略N行代码

导致这样重复工作的原因是为什么?
1.前端永远不可信;
2.前端和后端使用不同的编程语言;
这样的冗余会带来什么代价?
1.修改业务逻辑,需要重复做2次:如突然发现少支持了 docx 文件类型,需要同时修改javascript代码和python代码
2.增加确保javascript代码和python代码业务逻辑一致的代价。需要分别写2种测试,unit test跑多一倍。
nodejs时代:DRY

Use nodejs no more DRY !

一份代码,前端后端同时运行
// constant.js 
(function(exports){ exports.RESUME_FILETYPES = 'doc,docx,pdf,txt,wps,odf,md,png,gif,jpg'; 
})( (function(){ 
if(typeof exports === 'undefined') { 
window.constant = {}; 
return window.constant; 
} else { 
return exports; 
} 
})() ); 
// util.js 
(function(exports){ 
/** 
* 移除字符串两端的空白字符 
* 
* @return {String} 
* @api public 
*/ 
String.prototype.trim = function(){ 
return this.replace(/(^\s*)|(\s*$)/g, ""); 
}; 
/** 
* 判断是否自定类型的文件 
* 
* @param {String}filename 
* @param {String}types, 多个类型使用,号分隔,如 doc,docx,txt 
* @return {Boolean} true or false 
* @api public 
*/ 
var is_filetype = exports.is_filetype = function(filename, types) { 
types = types.split(','); 
var pattern = '\.('; 
for(var i=0; i<types.length; i++) { 
if(0 != i) { 
pattern += '|'; 
} 
pattern += types[i].trim(); 
} 
pattern += ')$'; 
return new RegExp(pattern, 'i').test(filename); 
}; 
})( (function(){ 
if(typeof exports === 'undefined') { 
window.util = {}; 
return window.util; 
} else { 
return exports; 
} 
})() );

前端
<script src="/js/util.js"></script> 
<script src="/js/constant.js"></script> // 此处省略N行代码 
if(!util.is_filetype($('#uploadfile').val(), constant.RESUME_FILETYPES)){ 
can_submit = false; // 不允许上传 
$('#uploadfile').val(''); 
alert('只允许上传: ' + constant.RESUME_FILETYPES); 
} 
// 此处省略N行代码

后端
var util = require('./public/js/util.js'), 
constant = require('./public/js/constant.js'); 
app.post('/resume/upload/:job_id', function(req, res, next){ 
req.form.complete(function(err, fields, files){ 
if(!util.is_filetype(filepath, constant.RESUME_FILETYPES)) { 
// 由于客户端已做判断,所以这样的情况都是恶意上传的,直接提示 
res.send('文件格式错误: ' + filepath 
+ ' , 请上传' + constant.RESUME_FILETYPES + '格式的文件'); 
return; 
} 
// save file ... 
// 此处省略N行代码 
}); 
});

wow,没冗余了吧!done
其他常用场景
常量定义
各种有用的工具模块,如字符串操作
NodeJs 相关文章推荐
NodeJs中的非阻塞方法介绍
Jun 05 NodeJs
提高NodeJS中SSL服务的性能
Jul 15 NodeJs
nodejs的10个性能优化技巧
Jul 15 NodeJs
nodejs教程之制作一个简单的文章发布系统
Nov 21 NodeJs
轻松创建nodejs服务器(7):阻塞操作的实现
Dec 18 NodeJs
ubuntu下安装nodejs以及升级的办法
May 08 NodeJs
nodejs利用http模块实现银行卡所属银行查询和骚扰电话验证示例
Dec 30 NodeJs
在Debian(Raspberry Pi)树莓派上安装NodeJS的教程详解
Sep 19 NodeJs
nodejs实现的简单web服务器功能示例
Mar 15 NodeJs
基于Nodejs的Tcp封包和解包的理解
Sep 19 NodeJs
nodejs中的异步编程知识点详解
Jan 17 NodeJs
NodeJS和浏览器中this关键字的不同之处
Mar 03 NodeJs
golang、python、php、c++、c、java、Nodejs性能对比
Mar 12 #NodeJs
PHPStorm 2020.1 调试 Nodejs的多种方法详解
Sep 17 #NodeJs
nodejs实用示例 缩址还原
Dec 28 #NodeJs
NodeJS框架Express的模板视图机制分析
Jul 19 #NodeJs
用nodejs访问ActiveX对象,以操作Access数据库为例。
Dec 15 #NodeJs
NodeJS 模块开发及发布详解分享
Mar 07 #NodeJs
nodejs入门详解(多篇文章结合)
Mar 07 #NodeJs
You might like
php横向重复区域显示二法
2008/09/25 PHP
php 友好URL的实现(吐血推荐)
2008/10/04 PHP
详解在PHP的Yii框架中使用行为Behaviors的方法
2016/03/18 PHP
PHP MSSQL 分页实例
2016/04/13 PHP
浅谈PHP中的数据传输CURL
2016/09/06 PHP
PHP设计模式之工厂模式实例总结
2017/09/01 PHP
学习并汇集javascript匿名函数
2010/11/25 Javascript
javascript中直接写php代码的方法
2013/07/31 Javascript
Seajs的学习笔记
2014/03/04 Javascript
jquery的trigger和triggerHandler的区别示例介绍
2014/04/20 Javascript
angularJS 入门基础
2015/02/09 Javascript
jQuery的Read()方法代替原生JS详解
2016/11/08 Javascript
简单实现Bootstrap标签页
2020/08/09 Javascript
JavaScript实现随机数生成器(去重)
2017/10/13 Javascript
你不知道的Vue技巧之--开发一个可以通过方法调用的组件(推荐)
2019/04/15 Javascript
JS控制只能输入数字并且最多允许小数点两位
2019/11/24 Javascript
jquery实现轮播图特效
2020/04/12 jQuery
vue实现把接口单独存放在一个文件方式
2020/08/13 Javascript
[02:32]DOTA2英雄基础教程 美杜莎
2014/01/07 DOTA
[57:55]EG vs Fnatic 2018国际邀请赛小组赛BO2 第一场 8.19
2018/08/21 DOTA
Python标准库之多进程(multiprocessing包)介绍
2014/11/25 Python
使用Python脚本在Linux下实现部分Bash Shell的教程
2015/04/17 Python
python机器学习理论与实战(四)逻辑回归
2018/01/19 Python
Python数据分析库pandas基本操作方法
2018/04/08 Python
浅谈PySpark SQL 相关知识介绍
2019/06/14 Python
python实时检测键盘输入函数的示例
2019/07/17 Python
使用pickle存储数据dump 和 load实例讲解
2019/12/30 Python
使用spring mvc+localResizeIMG实现HTML5端图片压缩上传的功能
2016/12/16 HTML / CSS
销售人员自我评价怎么写
2013/09/19 职场文书
文明礼仪小标兵事迹
2014/01/12 职场文书
企业安全生产责任书
2014/04/14 职场文书
大学生村官个人对照检查材料(群众路线)
2014/09/26 职场文书
质量保证书格式模板
2015/02/27 职场文书
绿色环保倡议书
2015/04/28 职场文书
2015年幼儿园班务工作总结
2015/05/12 职场文书
详解SQL报错盲注
2022/07/23 SQL Server