标签:表示 处理异常 about sql utf8编码 属性 算法 活跃 dal
http://blog.csdn.net/yanghua_kobe/article/details/17199417
这是一个资产管理项目,主要的目的就是实现对资产的无纸化管理。通过为每个资产生成二维码,来联合移动终端完成对资产的审核等。这个项目既提供了Web端的管理界面也提供移动端(Andorid)的资产审核、派发等相关功能。
我们用Node.js构建该项目的Web端以及移动端的Serveice API。
Express 是一个非常流行的Node.js的web框架。基于connect(node中间件框架)。提供了很多便于处理http请求等web开发相关的扩展。
Express简单的结构图:
Express的特性:
Bootstrap是Twitter推出的一个用于前端开发的开源工具包。它由Twitter的设计师MarkOtto和JacobThornton合作开发,是一个CSS/HTML框架。Bootstrap是简洁、直观、强悍的前端开发框架,让web开发更迅速、简单。
同时,很多基于Bootstrap的开源插件也让Bootstrap社区更加活跃。
最新的Bootstrap3提供了非常强的定制化特性。包括Less,jQuery插件等。
Bootstrap 为您提供了所有这些基本的模块- Grid、Typography、Tables、Forms、Buttons和Responsiveness。
此外,还有大量其他有用的前端组件,比如Dropdowns、Navigation、Modals、Typehead、Pagination、Carousal、Breadcrumb、Tab、Thumbnails、Headers等等。
有了这些,你可以搭建一个Web 项目,并让它运行地更快速更轻松。
此外,由于整个框架是基于模块的,你可以通过定制你自己的CSS来使得它满足你的特殊需求。
它是基于几种最佳实践,我们认为这是一个很好的开始学习现代Web 开发的时机,一旦你掌握了HTML 和JavaScript/jQuery 的基本知识,你就可以在Web 开发中运用这些知识。
Ember.js是一个JavaScript的MVC框架,它由Apple前雇员创建的SproutCore2.0改名进化而来。
构建一个Ember应用程序,通常会使用到六个主要部件:应用程序(Application)、模型(Model)、视图(View)、模板(Template)、路由(Routing)和控制器(Controller)。
这里我们server端主要依赖express框架,它提供的这些功能跟express有些是相同的。我们主要应用了Ember的模板组件,Express对于它提供了很好的集成。我们只需要进行很简单的配置即可:
should 是用于node.js的一个表述性、可读性很强的测试无关的“断言”库。它是BDD风格的,用一个单例的不可枚举的属性访问器扩展了Object的prototype,允许你表述对象应该展示的行为。
should的一个特性是可以支持链式断言,比如:
功能简介:MySQL- node.js平台MySQL驱动,支持事务、连接池、集群、sql注入检测、多做参数传递写法等特性。
主页地址:https://github.com/felixge/node-mysql
功能简介:eventproxy- node.js 异步回调代理。主要用来解决node中深层次回调嵌套的问题,支持很多异步模式:多类型异步、重复异步、持续型异步。
主页地址:https://github.com/JacksonTian/eventproxy
功能简介:javascript的验证工具集,支持两种模式:check(校验)/sanitize(处理),同时提供了可扩展的错误处理。
主页地址:http://github.com/chriso/node-validator
功能简介:embered.jsjavascript 模板引擎(可以跟express集成,作为服务端模板引擎)
功能简介:loader- 资源加载工具,可以区分开发模式、发布模式;在发布模式下可进行资源压缩、合并。以实现减少静态资源带宽并且便于实现客户端缓存
主页地址:https://github.com/TBEDP/loader
功能简介:canvas - node.js 常用的图形图像处理库,是很多其它库的基础依赖库
主页地址:https://github.com/learnboost/node-canvas
功能简介:captchagen-node.js常用验证码图片处理库,依赖上面的canvas库
主页地址:http://github.com/wearefractal/captchagen
功能简介:crypto-js- javascript 常用加密库、hash库封装,支持sha-x / md5 / hash等各种加密、hash算法
主页地址:http://github.com/wearefractal/captchagen
功能简介:nodemailer- 邮件发送工具,支持SMTP等邮件发送协议
主页地址:http://github.com/andris9/nodemailer
功能简介:qrcode- node.js服务端的qrcode生成器。支持多种输出类型(dataUrl/file/bitArray)
主页地址:http://github.com/soldair/node-qrcode
功能简介:qrcode- node.js服务端的qrcode生成器。支持多种输出类型(dataUrl/file/bitArray)
主页地址:http://github.com/soldair/node-qrcode
功能简介:excel- node.js excel解析器,支持xlsx(Excel2007+)
主页地址:https://github.com/trevordixon/excel
功能简介:excel-export- node.js excel生成器,支持导出excel
主页地址:https://github.com/functionscope/Node-Excel-Export
功能简介:net-ping- node.js 对ping的封装,用于测试目标主机是否可达
主页地址:https://bitbucket.org/stephenwvickers/node-net-ping
功能简介:debug- node.js debug工具,对console.log的封装,支持多种颜色输出。
主页地址:https://github.com/visionmedia/debug
npm是管理node.js模块依赖的工具,依赖于开源技术的优势就是你有非常多的优秀库可以帮助你快速构建一个系统,但就像一把双刃剑,由于开源导致版本的升级不可控。这时,一个集中性的模块依赖管理工具的优势就十分明显。它负责帮你管理开源项目的版本,你只需要添加对某个开源模块的依赖即可。
unix/Linux下安装npm:
如何在项目中使用npm管理你的依赖:
(1)在项目的根目录下创建一个package.json文件
在dependencies下添加所需要依赖的模块,示例如下:这时你会发现,项目的根目录下多了一个node_modules文件夹,那里面就是从npm远程库里下载的模块然后“安装”到你的项目中的。
现在,你就可以在你的项目中应用你依赖的这些modules了。你可以通过require关键字来使用他们。比如,
node.js的模块加载基于CommonJS规范。
在Node.js中,将模块分为两大类:
(1)原生模块
原生模块在Node.js源代码编译的时候编译进了二进制执行文件,加载速度最快。
(2)文件模块
node.js依赖modulepath(模块路径)来加载module,而modulepath的生成规则主要是从当前文件目录开始查找node_modules文件夹,然后依次进入父目录查找父目录下的node_modules目录直至到根目录下得node_modules目录。所以在require的时候,如果带上module的路径,则按照该路径查找,如果没有就按照上面的node_modules文件夹向上追溯查找,如果都没有找到,则抛出异常。
项目环境的构建、部署都是自动化的。
我们假设项目最终会发布在任意版本的Ubuntuserver上。在安装Git的前提下,通过如下命令去clone项目到本地:
node.js 到处都是异步调用。常用的try/catch同步捕获异常并处理的方式,在这里不起作用了。这是因为很多callback已经离开了当时try的上下文,导致无法获取异常产生的堆栈信息。基于这个问题,我们对异常处理的模式按类型进行区分处理:
(1)http请求异常
这种异常Express就可以进行处理。如果是非法请求,在路由的时候,对未匹配的请求进行统一处理:
(2)业务异常
这种异常通常不会影响到程序的运行,我们以不同的异常代码返回给前端或者终端,来给调用端友好的提示。
(3)应用程序级别的异常或必须处理的错误
这种情况下,应用程序可能没有办法处理异常,也有可能由应用程序抛出。对于这种应用程序级别的异常。我们用两种方式来catch:
[1]利用Express提供的应用程序的异常处理机制:web应用中对于资源的定义大致分为:静态资源、动态资源两种。动态资源通常是可变的,需要进行相应处理的,而静态资源在线上通常都是不会变的。常见的静态资源有:javascript文件、css文件、图片文件等。对于这些静态文件,我们通过设置过期时间来进行缓存。而对于文本文件,由于浏览器的解析行为,对他们进行合并或者压缩都不会产生影响。
这里需要提到我们在组件中介绍的Loader。在项目刚被clone下来的时候,需要先执行makebuild来对项目进行初始化。在初始化的过程中,Loader会对项目的views文件夹中的文件进行扫描。它通常会扫描html界面:查找类似于如下的片段:
Restful以“Resource”为核心概念,认为URL是用来表示一种资源。而不应该表示一个动作或者其他的东西。而动作,比如“CRUD”正好对应http的四个method:get/post/put/delete。本项目中,我们大部分的URL以Restful风格为主,但没有严格贯彻执行。
前端我们采用的是ejs的模板来构建,它很好得实现了html的片段化、组件化。有一个基础的模板,别的都只是一块html片段。它们在服务端完成组合、解析,生成完整的html流输出到客户端。
这样的开发模式,使得前端代码的划分比较清晰,组件化也使得代码的复用变得更容易。
在项目初始化的过程中,我们使用makefile文件来使得一些动作自动化运行。比如我们之前提到过的构建assets.json来合并文件的动作,就是通过执行makebuild文件来完成的。
目前,Node.js还没有很强大的调试工具。常用的辅助诊断方式就是打log。但繁多的日志输出,混杂在http log里实在是不方便判断。我们在项目中使用了debug module来进行debug,他支持对log加不同颜色的key word并且还支持timestamp。你在一大堆日志中,一眼就足以区分是从哪个module或者组件输出的。我们在项目中对不同的layer应用不同的关键字:
将其置为全局:
依赖会被自动写入package.json的devDependencies项中。
关于Gruntfile的编写规则,详细请查看,Gruntjs中文文档。你只需要在项目的根目录下,创建一个.jsbeautifyrc文件,里面对缩进,空格等进行定义即可覆盖默认配置。这非常方便那些已经习惯了自己有一套代码风格的人使用这些插件。
更难能可贵的是,对于一个项目你可以有多个.jsbeautifyrc文件进行配置。他们的优先级取决于这些配置文件靠近待格式化文件的程度(某种意义上就是这些配置文件在目录层次的深度)。这非常切换我们的需求:因为node项目前后端都是js。对于后端我们采用的是4空格缩进,对于前端JS我们采用的2空格缩进。那么我们只需要在前端JS文件夹下,新建一个新的.jsbeautifyrc配置文件,copy上面的配置,然后将indent_size修改为2即可。自动格式化工具只是一种“效率工具”,不足以形成“强制规定”。这里我们辅以代码检查工具,来强制要求代码风格、语法规范。
检查工具在GruntSection已经列出,在commit代码之前,必须运行检查,并确保没有任何Warnning跟Error。2.x处理错误有专门的一个API:
3.x退而采用middleware的方式来处理:
eventproxy是淘宝前端团队开发的一个node.js事件处理代理。用于辅助开放人员组织代码的执行顺序,对于很多需要干预执行顺序与过程的代码,避免了node.js深层嵌套的callback模式。
async跟eventproxy出于同样的目的。但在API的设计模式上有所差异。async的API的风格偏向于“整合”,Eventproxy偏向于“拆分”。model的定义
MongoDB里数据的集合称之为collection。而每个collection都有一个schema与之对应,可以简单的理解为是对其数据的定义(类型与结构)。
对应到mongoose里,一个schema是一个model,形如:程序设计的一个重要指标:模块性。在c/c++里有头文件,在面向对象语言里有pagckage/namespace的概念。他们的目的之一就是提升模块性,降低耦合度。
在node.js中,我们也可以采用类似c/c++的headfile的模式,以层为单位。将对外可见的以文件为单位的module以一个独立的文件对外开放(通常我们称其为index.js文件)。形如:supertest是一个用于模拟http request的module,可借助其进行web功能测试。
它提供了基于描述的API链式调用,可以非常容易得模拟http请求测试,形如:密码只是采用hash方式进行“加密”,还是相当不安全的。随着现在计算能力的增强以及字典规模的扩大,简单的md5已经非常不安全。一旦被拖库,密码很容易就会被破解。关于密码的问题,除了采用(SSL加密数据传输链路)一直都没有非常成熟的解决方案。所以,问题就退而求其次转变为如何提升破解难度的问题。而在密码中混入salt,是一直非常经济而有效的方式。这里我们处理用户身份认证的方式是:
入库之后的加密密码 = sha3 (md5 (passwrod) + salt)
其中:salt的计算方式为:sha256(userName)在windows上打包的zip压缩包,在ubuntu上解压缩后,凡是文件名含有中文的都出现了乱码。产生这一问题的原因是:在windows上压缩文件,通常采用系统默认编码(通常是gbk或gb2312),而传到Linux上去,在linux上通常都默认采用的utf8编码,所以需要进行解码。
项目中有需要在服务器上对上传上来的zip压缩包解压缩的步骤,默认调用的是shell命令(unzip命令)。网上很多提供的解决方案是通过提供"-O"参数,显示指定编码。但未能成功,因为在现在版本的unzip里,该参数已经失效了。通过unzip几经折腾,还是无法解决乱码问题,于是转而采用7z来进行解压缩,并显式指定英文环境ASCII编码(通过LANG=C),示例:其中参数“e”表示释放所有文件到目标路径(递归所有压缩包中的子文件夹),参数“-O”指定解压到的路径(注意参数-O跟输出路径中间无空格)。
这一步只是完成了解压,文件名这时还是乱码的。此时需要linux上专门的转码工具——convmv来进行编码转换!
如果该命令不存在,可以先apt-getinstall一下,然后运行如下命令:这是你只要关注文件名是否会产生乱码,无需关注目录名,如果没有乱码,就可以安全转换了。
如果文件内容有乱码,可以借助如下命令对文件进行转码:标签:表示 处理异常 about sql utf8编码 属性 算法 活跃 dal
原文地址:http://www.cnblogs.com/dhcn/p/7125095.html