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 相关文章推荐
PHPStorm 2020.1 调试 Nodejs的多种方法详解
Sep 17 NodeJs
浅谈Nodejs观察者模式
Oct 13 NodeJs
nodejs中向HTTP响应传送进程的输出
Mar 19 NodeJs
详解nodeJS之路径PATH模块
May 31 NodeJs
CentOS 安装NodeJS V8.0.0的方法
Jun 15 NodeJs
nodejs开发微信小程序实现密码加密
Jul 11 NodeJs
nodejs构建本地web测试服务器 如何解决访问静态资源问题
Jul 14 NodeJs
Windows下使用Nodejs运行js的方法
Sep 02 NodeJs
nodejs操作mongodb的增删改查功能实例
Nov 09 NodeJs
nodejs用gulp管理前端文件方法
Jun 24 NodeJs
nodejs 如何手动实现服务器
Aug 20 NodeJs
5分钟教你用nodeJS手写一个mock数据服务器的方法
Sep 10 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 和 COM
2006/10/09 PHP
php 之 没有mysql支持时的替代方案
2006/10/09 PHP
使用PHP批量生成随机用户名
2008/07/10 PHP
浅谈PHP强制类型转换,慎用!
2013/06/06 PHP
免费手机号码归属地API查询接口和PHP使用实例分享
2014/04/10 PHP
这些年、我收集的JQuery代码小结
2012/08/01 Javascript
JS 两日期相减,获得天数的小例子(兼容IE,FF)
2013/07/01 Javascript
jQuery分别获取选中的复选框值的示例
2014/06/17 Javascript
js正则表达式匹配数字字母下划线等
2015/04/14 Javascript
JavaScript面对国际化编程时的一些建议
2015/06/24 Javascript
基于JavaScript实现动态添加删除表格的行
2016/02/01 Javascript
indexedDB bootstrap angularjs之 MVC DOMO (应用示例)
2016/06/20 Javascript
老生常谈onBlur事件与onfocus事件(js)
2016/07/09 Javascript
AngularJS控制器详解及示例代码
2016/08/16 Javascript
微信小程序开发之大转盘 仿天猫超市抽奖实例
2016/12/08 Javascript
vue.js将unix时间戳转换为自定义时间格式
2017/01/03 Javascript
ES6新特性六:promise对象实例详解
2017/04/21 Javascript
AngularJS路由删除#符号解决的办法
2017/09/28 Javascript
JS实现自定义弹窗功能
2018/08/08 Javascript
微信小程序实现列表页的点赞和取消点赞功能
2018/11/02 Javascript
[01:14:55]EG vs Spirit Supermajor 败者组 BO3 第三场 6.4
2018/06/05 DOTA
Python numpy.zero() 初始化矩阵实例
2019/11/27 Python
在服务器上安装python3.8.2环境的教程详解
2020/04/26 Python
python右对齐的实例方法
2020/07/05 Python
Python引入多个模块及包的概念过程解析
2020/09/21 Python
CSS3区域模块region相关编写示例
2015/08/28 HTML / CSS
html+js 实现markdown编辑器效果
2019/10/23 HTML / CSS
Mankind美国/加拿大:英国领先的男士美容护发用品公司
2018/12/05 全球购物
加拿大在线眼镜零售商:SmartBuyGlasses加拿大
2019/05/25 全球购物
国际经济贸易专业推荐信
2013/11/06 职场文书
积极向上的团队口号
2014/06/06 职场文书
数学教研活动总结
2014/07/02 职场文书
夫妻分居协议书范本
2014/11/28 职场文书
springboot如何接收application/x-www-form-urlencoded类型的请求
2021/11/02 Java/Android
Docker下安装Oracle19c
2022/04/13 Servers
vue组件冲突之引用另一个组件出现组件不显示的问题
2022/04/13 Vue.js