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学习小结(一)
Jul 06 NodeJs
基于 Docker 开发 NodeJS 应用
Jul 30 NodeJs
浅析nodejs实现Websocket的数据接收与发送
Nov 19 NodeJs
浅谈Nodejs应用主文件index.js
Aug 28 NodeJs
基于Nodejs利用socket.io实现多人聊天室
Feb 22 NodeJs
Nodejs 和Session 原理及实战技巧小结
Aug 25 NodeJs
nodejs项目windows下开机自启动的方法
Nov 22 NodeJs
Nodejs 和 Electron ubuntu下快速安装过程
May 04 NodeJs
nodejs之koa2请求示例(GET,POST)
Aug 07 NodeJs
NodeJS搭建HTTP服务器的实现步骤
Oct 12 NodeJs
nodejs分离html文件里面的js和css的方法
Apr 09 NodeJs
nodejs提示:cross-device link not permitted, rename错误的解决方法
Jun 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 格式化数字的时候注意数字的范围
2010/04/13 PHP
详解php伪造Referer请求反盗链资源
2019/01/24 PHP
在textarea中屏蔽js的某个function的javascript代码
2007/04/20 Javascript
JS 动态加载脚本的4种方法
2009/05/05 Javascript
基于jquery的一个图片hover的插件
2010/04/24 Javascript
几个有趣的Javascript Hack
2010/07/24 Javascript
jquery下拉select控件操作方法分享(jquery操作select)
2014/03/25 Javascript
基于jQuery实现select下拉选择可输入附源码下载
2016/02/03 Javascript
简单理解vue中el、template、replace元素
2016/10/27 Javascript
Javascript创建类和对象详解
2017/05/31 Javascript
javascript 产生随机数的几种方法总结
2017/09/26 Javascript
JavaScript体验异步更好的解决办法
2018/01/08 Javascript
深入理解 webpack 文件打包机制(小结)
2018/01/08 Javascript
layer.close()关闭进度条和Iframe窗的方法
2018/08/17 Javascript
webpack4+Vue搭建自己的Vue-cli项目过程分享
2018/08/29 Javascript
vue.js引入外部CSS样式和外部JS文件的方法
2019/01/06 Javascript
使用python编写android截屏脚本双击运行即可
2014/07/21 Python
Python易忽视知识点小结
2015/05/25 Python
利用aardio给python编写图形界面
2017/08/21 Python
Python浅复制中对象生存周期实例分析
2018/04/02 Python
python中验证码连通域分割的方法详解
2018/06/04 Python
Python标准库shutil用法实例详解
2018/08/13 Python
Python告诉你木马程序的键盘记录原理
2019/02/02 Python
python新手学习使用库
2020/06/11 Python
python pygame 愤怒的小鸟游戏示例代码
2021/02/25 Python
浅谈CSS3中的变形功能-transform功能
2017/12/27 HTML / CSS
TUMI澳大利亚网站:美国旅行箱包品牌
2017/03/27 全球购物
寻找迷宫的一条出路,o通路;X:障碍
2016/07/10 面试题
索引覆盖(Index Covering)查询含义
2012/02/18 面试题
开展党的群众路线教育实践活动方案
2014/02/05 职场文书
《假如》教学反思
2014/04/17 职场文书
兽医医药专业求职信
2014/07/27 职场文书
放射科岗位职责
2015/02/14 职场文书
单位综合评价意见
2015/06/05 职场文书
遗愿清单观后感
2015/06/09 职场文书
mysql升级到5.7时,wordpress导数据报错1067的问题
2021/05/27 MySQL