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教程 安装express及配置app.js文件的详细步骤
May 11 NodeJs
使用nodejs、Python写的一个简易HTTP静态文件服务器
Jul 18 NodeJs
NodeJS学习笔记之网络编程
Aug 03 NodeJs
NodeJS学习笔记之(Url,QueryString,Path)模块
Jan 13 NodeJs
NodeJS中利用Promise来封装异步函数
Feb 25 NodeJs
初识NodeJS服务端开发入门(Express+MySQL)
Apr 07 NodeJs
详解Nodejs之静态资源处理
Jun 05 NodeJs
nodejs创建简易web服务器与文件读写的实例
Sep 07 NodeJs
nodejs项目windows下开机自启动的方法
Nov 22 NodeJs
Nodejs libuv运行原理详解
Aug 21 NodeJs
纯异步nodejs文件夹(目录)复制功能
Sep 03 NodeJs
nodejs实现的http、https 请求封装操作示例
Feb 06 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
乱谈我对耳机、音箱的感受
2021/03/02 无线电
php url地址栏传中文乱码解决方法集合
2010/06/25 PHP
表单提交错误后返回内容消失问题的解决方法(PHP网站)
2015/10/20 PHP
一行代码实现纯数据json对象的深度克隆实现思路
2013/01/09 Javascript
jquery实现滑动图片自己测试的例子
2013/11/05 Javascript
返回上一页并自动刷新的JavaScript代码
2014/02/19 Javascript
首页图片漂浮效果示例代码
2014/06/05 Javascript
JS+CSS实现简易的滑动门效果代码
2015/09/24 Javascript
js实现交通灯效果
2017/01/13 Javascript
nodejs制作爬虫实现批量下载图片
2017/05/19 NodeJs
angularjs项目的页面跳转如何实现(5种方法)
2017/05/25 Javascript
BootStrap Table 后台数据绑定、特殊列处理、排序功能
2017/05/27 Javascript
angularjs+bootstrap实现自定义分页的实例代码
2017/06/19 Javascript
koa socket即时通讯的示例代码
2018/09/07 Javascript
详解一次Vue低版本安卓白屏问题的解决过程
2019/05/30 Javascript
小程序使用watch监听数据变化的方法详解
2019/09/20 Javascript
jQuery 实现DOM元素拖拽交换位置的实例代码
2020/07/14 jQuery
js实现简易拖拽的示例
2020/10/26 Javascript
[06:15]2016国际邀请赛中国区预选赛单车采访:我顶WINGS
2016/06/27 DOTA
详解Django之admin组件的使用和源码剖析
2018/05/04 Python
python面试题之列表声明实例分析
2019/07/08 Python
Python Numpy数组扩展repeat和tile使用实例解析
2019/12/09 Python
Python 格式化打印json数据方法(展开状态)
2020/02/27 Python
今天学到的CSS最新技术(与图片背景相关)
2012/12/24 HTML / CSS
世界上获奖最多的手机镜头:Olloclip
2018/03/03 全球购物
甜美蛋糕店创业计划书
2014/01/30 职场文书
狼和鹿教学反思
2014/02/05 职场文书
超市活动计划书
2014/04/24 职场文书
爱心活动计划书
2014/04/26 职场文书
2014镇副书记群众路线专题民主生活会思想汇报
2014/09/23 职场文书
孔子观后感
2015/06/08 职场文书
学生会宣传部竞选稿
2015/11/21 职场文书
2016暑期师德培训心得体会
2016/01/09 职场文书
HR必备:超全面的薪酬待遇管理方案!
2019/07/12 职场文书
Python文件的操作示例的详细讲解
2021/04/08 Python
Go遍历struct,map,slice的实现
2021/06/13 Golang