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 npm package.json中文文档
Sep 04 NodeJs
nodejs教程之制作一个简单的文章发布系统
Nov 21 NodeJs
Nodejs学习笔记之Global Objects全局对象
Jan 13 NodeJs
详解nodejs与javascript中的aes加密
May 22 NodeJs
nodejs利用http模块实现银行卡所属银行查询和骚扰电话验证示例
Dec 30 NodeJs
nodejs的压缩文件模块archiver用法示例
Jan 18 NodeJs
Nodejs 发送Post请求功能(发短信验证码例子)
Feb 09 NodeJs
nodejs连接mysql数据库及基本知识点详解
Mar 20 NodeJs
nodejs实现一个word文档解析器思路详解
Aug 14 NodeJs
NodeJs入门教程之定时器和队列
Mar 08 NodeJs
NodeJs之word文件生成与解析的实现代码
Apr 01 NodeJs
Nodejs 识别图片类型的方法
Aug 15 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中sprintf与printf函数用法区别解析
2014/02/17 PHP
详解PHP中的Traits
2015/07/29 PHP
JS 动态加载脚本的4种方法
2009/05/05 Javascript
JavaScript Eval 函数使用
2010/03/23 Javascript
javascript 二分法(数组array)
2010/04/24 Javascript
JS实现的一个简单的Autocomplete自动完成例子
2014/04/16 Javascript
JS中的form.submit()不能提交表单的错误原因
2014/10/08 Javascript
jQuery链使用指南
2015/01/20 Javascript
jquery调取json数据实现省市级联的方法
2015/01/29 Javascript
JavaScript中的boolean布尔值使用学习及相关技巧讲解
2016/05/26 Javascript
详解vue-router 2.0 常用基础知识点之router-link
2017/05/10 Javascript
原生JS实现图片网格式渐显、渐隐效果
2017/06/05 Javascript
highcharts 在angular中的使用示例代码
2017/09/20 Javascript
详细介绍RxJS在Angular中的应用
2017/09/23 Javascript
微信小程序模板template简单用法示例
2018/12/04 Javascript
何时/使用 Vue3 render 函数的教程详解
2020/07/25 Javascript
vant 解决tab切换插件标题样式自定义的问题
2020/11/13 Javascript
Python中使用MELIAE分析程序内存占用实例
2015/02/18 Python
Python将xml和xsl转换为html的方法
2015/03/10 Python
在Python的Flask框架下收发电子邮件的教程
2015/04/21 Python
python逐行读写txt文件的实例讲解
2018/04/03 Python
python多线程同步之文件读写控制
2021/02/25 Python
python的scipy实现插值的示例代码
2019/11/12 Python
python剪切视频与合并视频的实现
2020/03/03 Python
Python垃圾回收机制三种实现方法
2020/04/27 Python
python实现无边框进度条的实例代码
2020/12/30 Python
Html5适配iphoneX刘海屏的简单实现
2019/04/09 HTML / CSS
Linux中如何用命令创建目录
2015/01/12 面试题
大专生的学习自我评价
2013/12/04 职场文书
车间安全生产标语
2014/06/06 职场文书
现场活动策划方案
2014/08/22 职场文书
党员干部群众路线教育实践活动个人对照检查材料
2014/09/23 职场文书
银行招聘自荐信
2015/03/06 职场文书
2015年组织部工作总结
2015/04/03 职场文书
入党宣誓大会后的感想
2015/08/10 职场文书
使用Python开发冰球小游戏
2022/04/30 Python