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学习笔记之Connect中间件应用实例
Jan 27 NodeJs
浅谈NodeJS中require路径问题
May 07 NodeJs
详解nodejs与javascript中的aes加密
May 22 NodeJs
Nodejs中解决cluster模块的多进程如何共享数据问题
Nov 10 NodeJs
详解nodejs 文本操作模块-fs模块(一)
Dec 22 NodeJs
详解NodeJs支付宝移动支付签名及验签
Jan 06 NodeJs
angular2+nodejs实现图片上传功能
Mar 27 NodeJs
NodeJs通过async/await处理异步的方法
Oct 09 NodeJs
nodejs基于mssql模块连接sqlserver数据库的简单封装操作示例
Jan 05 NodeJs
NodeJS父进程与子进程资源共享原理与实现方法
Mar 16 NodeJs
详解Nodejs内存治理
May 13 NodeJs
nodejs遍历文件夹下并操作HTML/CSS/JS/PNG/JPG的方法
Nov 01 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实现的一个很好用HTML解析器类可用于采集数据
2013/09/23 PHP
php中PDO方式实现数据库的增删改查
2015/05/17 PHP
php递归实现无限分类的方法
2015/07/28 PHP
PHP+ajax分页实例简析
2015/12/07 PHP
PHP中addslashes与mysql_escape_string的区别分析
2016/04/25 PHP
Yii2 assets清除缓存的方法
2016/05/16 PHP
用js怎么把&amp;字符换成&quot;&amp;amp:&quot;
2006/10/19 Javascript
用jquery实现等比例缩放图片效果插件
2010/07/24 Javascript
Nodejs学习笔记之测试驱动
2015/04/16 NodeJs
JavaScript File分段上传
2016/03/10 Javascript
js 判断一组日期是否是连续的简单实例
2016/07/11 Javascript
js实现上传图片预览方法
2016/10/25 Javascript
Javascript中for循环语句的几种写法总结对比
2017/01/23 Javascript
BootStrap表单控件之复选框checkbox和单选择按钮radio
2017/05/23 Javascript
关于angularJs清除浏览器缓存的方法
2017/11/28 Javascript
JS实现读取xml内容并输出到div中的方法示例
2018/04/19 Javascript
Electron autoUpdater实现Windows安装包自动更新的方法
2018/12/24 Javascript
深入分析element ScrollBar滚动组件源码
2019/01/22 Javascript
使用JS来动态操作css的几种方法
2019/12/18 Javascript
javascript中可能用得到的全部的排序算法
2020/03/05 Javascript
vue实现点击按钮切换背景颜色的示例代码
2020/06/23 Javascript
[02:42]DOTA2英雄基础教程 杰奇洛
2013/12/23 DOTA
对python .txt文件读取及数据处理方法总结
2018/04/23 Python
python系列 文件操作的代码
2019/10/06 Python
Flask项目中实现短信验证码和邮箱验证码功能
2019/12/05 Python
python输出第n个默尼森数的实现示例
2020/03/08 Python
详解python如何引用包package
2020/06/07 Python
美国旅游网站:Tours4Fun
2017/02/17 全球购物
英国豪华针织品牌John Smedley的在线销售商:The Outlet by John Smedley
2018/04/08 全球购物
机电一体化专业应届生求职信
2013/11/27 职场文书
房地产促销活动方案
2014/03/01 职场文书
安全资料员岗位职责范本
2014/06/28 职场文书
最美家庭活动方案
2014/08/31 职场文书
教师党员个人整改措施材料
2014/09/16 职场文书
专业见习报告范文
2014/11/03 职场文书
MySQL 如何分析查询性能
2021/05/12 MySQL