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中使用monk访问mongodb
Jul 06 NodeJs
基于NodeJS的前后端分离的思考与实践(三)轻量级的接口配置建模框架
Sep 26 NodeJs
Nodejs实现批量下载妹纸图
May 28 NodeJs
图片上传之FileAPI与NodeJs
Jan 24 NodeJs
NodeJs测试框架Mocha的安装与使用
Mar 28 NodeJs
nodejs multer实现文件上传与下载
May 10 NodeJs
Nodejs实现多房间简易聊天室功能
Jun 20 NodeJs
docker中编译nodejs并使用nginx启动
Jun 23 NodeJs
nodejs中sleep功能实现暂停几秒的方法
Jul 12 NodeJs
Nodejs调用WebService的示例代码
Sep 29 NodeJs
nodejs 生成和导出 word的实例代码
Jul 31 NodeJs
nodejs微信开发之自动回复的实现
Mar 17 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
图形数字验证代码
2006/10/09 PHP
简单介绍下 PHP5 中引入的 MYSQLI的用途
2007/03/19 PHP
Ajax PHP 边学边练 之三 数据库
2009/11/26 PHP
利用php绘制饼状图的实现代码
2013/06/07 PHP
探讨:如何编写PHP扩展
2013/06/13 PHP
PHP获取POST数据的几种方法汇总
2015/03/03 PHP
在Mac OS上搭建Nginx+PHP+MySQL开发环境的教程
2015/12/21 PHP
In Javascript Class, how to call the prototype method.(three method)
2007/01/09 Javascript
Prototype使用指南之range.js
2007/01/10 Javascript
JQuery入门——事件切换之hover()方法应用介绍
2013/02/05 Javascript
Javascript核心读书有感之语句
2015/02/11 Javascript
jquery+html5烂漫爱心表白动画代码分享
2015/08/24 Javascript
使用jQuery处理AJAX请求的基础学习教程
2016/05/10 Javascript
jquery html5 视频播放控制代码
2016/11/06 Javascript
详解如何在vue-cli中使用vuex
2018/08/07 Javascript
JS实现的排列组合算法示例
2019/07/16 Javascript
微信h5静默和非静默授权获取用户openId的方法和步骤
2020/06/08 Javascript
[01:21:07]EG vs Liquid 2018国际邀请赛淘汰赛BO3 第一场 8.25
2018/08/29 DOTA
跟老齐学Python之字典,你还记得吗?
2014/09/20 Python
在Python中使用itertools模块中的组合函数的教程
2015/04/13 Python
python使用PyGame绘制图像并保存为图片文件的方法
2015/04/24 Python
Python SQLite3简介
2018/02/22 Python
Flask框架重定向,错误显示,Responses响应及Sessions会话操作示例
2019/08/01 Python
Python使用import导入本地脚本及导入模块的技巧总结
2019/08/07 Python
python实现堆排序的实例讲解
2020/02/21 Python
Python爬虫与反爬虫大战
2020/07/30 Python
世界上最全面的汽车零部件和配件集合:JC Whitney
2016/09/04 全球购物
德国骆驼商店:ActiveFashionWorld
2017/11/18 全球购物
英国床和浴室商场:Bed & Bath Emporium
2018/05/20 全球购物
Claire’s法国:时尚配饰、美容、珠宝、头发
2021/01/16 全球购物
一些Solaris面试题
2015/12/22 面试题
药学专业大专生的自我评价
2013/12/12 职场文书
11月红领巾广播稿
2014/01/17 职场文书
职务聘任书范文
2014/03/29 职场文书
2015年国庆节活动总结
2015/03/23 职场文书
宿舍卫生管理制度
2015/08/05 职场文书