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的require模块(文件模块/核心模块)及路径介绍
Jan 14 NodeJs
nodejs npm包管理的配置方法及常用命令介绍
Jun 05 NodeJs
基于html5和nodejs相结合实现websocket即使通讯
Nov 19 NodeJs
Nodejs Express4.x开发框架随手笔记
Nov 23 NodeJs
nodejs进阶(6)—连接MySQL数据库示例
Jan 07 NodeJs
NodeJs使用Mysql模块实现事务处理实例
May 31 NodeJs
Nodejs实现多房间简易聊天室功能
Jun 20 NodeJs
nodejs创建简易web服务器与文件读写的实例
Sep 07 NodeJs
nodejs 图片预览和上传的示例代码
Sep 30 NodeJs
nodejs中密码加密处理操作详解
Mar 20 NodeJs
nodejs制作小爬虫功能示例
Feb 24 NodeJs
Nodejs实现WebSocket代码实例
May 19 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
APMServ使用说明
2006/10/23 PHP
php Xdebug 调试扩展的安装与使用.
2010/03/13 PHP
php中定义网站根目录的常用方法
2010/08/08 PHP
PHP 数组基础知识小结
2010/08/20 PHP
如何批量替换相对地址为绝对地址(利用bat批处理实现)
2013/05/27 PHP
PHP使用MPDF类生成PDF的方法
2015/12/08 PHP
Laravel框架使用monolog_mysql实现将系统日志信息保存到mysql数据库的方法
2018/08/16 PHP
PHP PDOStatement::fetch讲解
2019/01/31 PHP
添加到收藏夹代码(兼容几乎所有的浏览器)
2007/01/09 Javascript
判断脚本加载是否完成的方法
2009/05/26 Javascript
JavaScript 反科里化 this [译]
2012/09/20 Javascript
js 表单提交后按钮变灰的实例代码
2013/08/16 Javascript
Jquery.addClass始终无效原因分析
2013/09/08 Javascript
JavaScript操作HTML元素和样式的方法详解
2015/10/21 Javascript
jquery自适应布局的简单实例
2016/05/28 Javascript
简单实现bootstrap导航效果
2017/02/07 Javascript
Linux使用Node.js建立访问静态网页的服务实例详解
2017/03/21 Javascript
微信小程序 页面滑动事件的实例详解
2017/10/12 Javascript
Vue侦测相关api的实现方法
2019/05/22 Javascript
layui关闭弹窗后刷新主页面和当前更改项的例子
2019/09/06 Javascript
layui禁用侧边导航栏点击事件的解决方法
2019/09/25 Javascript
解决vue v-for src 图片路径问题 404
2019/11/12 Javascript
taro小程序添加骨架屏的实现代码
2019/11/15 Javascript
基于vue实现微博三方登录流程解析
2020/11/04 Javascript
[00:31]DOTA2荣耀之路7:Miracle-空血无敌斩
2018/05/31 DOTA
[01:35]2018年度CS GO最佳战队-完美盛典
2018/12/17 DOTA
[00:06]Yes,it worked!小卡尔成功穿越时空加入战场!
2019/07/20 DOTA
[01:00:30]完美世界DOTA2联赛循环赛 Inki vs Matador BO2第二场 10.31
2020/11/02 DOTA
[40:27]完美世界DOTA2联赛PWL S3 PXG vs GXR 第一场 12.19
2020/12/24 DOTA
python 通过麦克风录音 生成wav文件的方法
2019/01/09 Python
在Python中字典根据多项规则排序的方法
2019/01/21 Python
python对输出的奇数偶数排序实例代码
2020/12/04 Python
Python项目实战之使用Django框架实现支付宝付款功能
2021/02/23 Python
利用CSS3实现文本框的清除按钮相关的一些效果
2015/06/23 HTML / CSS
大专自我鉴定范文
2013/10/23 职场文书
聚美优品广告词改编
2014/03/14 职场文书