使用Node.js完成的第一个项目的实践总结

本文涉及的产品
云数据库 RDS MySQL,集群系列 2核4GB
推荐场景:
搭建个人博客
RDS MySQL Serverless 基础系列,0.5-2RCU 50GB
密钥管理服务KMS,1000个密钥,100个凭据,1个月
简介:

项目简介

这是一个资产管理项目,主要的目的就是实现对资产的无纸化管理。通过为每个资产生成二维码,来联合移动终端完成对资产的审核等。这个项目既提供了Web端的管理界面也提供移动端(Andorid)的资产审核、派发等相关功能。
我们用Node.js构建该项目的Web端以及移动端的Serveice API。

项目主框架:Express 简介

Express 是一个非常流行的node.js的web框架。基于connect(node中间件框架)。提供了很多便于处理http请求等web开发相关的扩展。
Express简单的结构图:

Express的特性:

  • 基于Connect构建
  • 健壮的路由
  • 提供丰富的HTTP处理方法
  • 支持众多视图模板引擎(14+)
  • 内容协商
  • 专注于提供高性能
  • 环境基于配置
  • 快速构建可执行的应用程序
  • 高测试覆盖率

前端框架简介

Bootstrap

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

Ember.js是一个JavaScript的MVC框架,它由Apple前雇员创建的SproutCore2.0改名进化而来。
构建一个Ember应用程序,通常会使用到六个主要部件:应用程序(Application)、模型(Model)、视图(View)、模板(Template)、路由(Routing)和控制器(Controller)。
这里我们server端主要依赖express框架,它提供的这些功能跟express有些是相同的。我们主要应用了Ember的模板组件,Express对于它提供了很好的集成。我们只需要进行很简单的配置即可:

app.set('view engine', 'html'); 
app.set('views', path.join(__dirname, 'views'));
app.set("view options", {layout : false});
app.register('.html', require('ejs'));

测试框架简介

should.js

should 是用于node.js的一个表述性、可读性很强的测试无关的“断言”库。它是BDD风格的,用一个单例的不可枚举的属性访问器扩展了Object的prototype,允许你表述对象应该展示的行为。
should的一个特性是可以支持链式断言,比如:

user.should.be.an.instanceOf(Object).and.have.property('name', 'tj');
user.pets.should.be.instanceof(Array).and.have.lengthOf(4);

mocha


Mocha是一个简单、灵活、有趣的javascript测试框架。它可以同时适用于node.js跟浏览器端。可以很轻松得完成同步、异步测试,对产生异常的测试用例提供灵活以及准确的报告。可以通过接口实现BDD、TDD、QUnit风格。

mocha + should.js


mocha是可以实现BDD模式的测试框架,而should.js是BDD模式的断言库。把它们结合起来,可以组建出一个非常灵活,并且不失表述性的测试框架。我们所有给终端的接口,都基于它们完成了测试。

项目组件 - node modules

mysql

功能简介:mysql- node.js平台mysql驱动,支持事务、连接池、集群、sql注入检测、多做参数传递写法等特性。
主页地址:https://github.com/felixge/node-mysql

eventproxy

功能简介:eventproxy- node.js 异步回调代理。主要用来解决node中深层次回调嵌套的问题,支持很多异步模式:多类型异步、重复异步、持续型异步。
主页地址:https://github.com/JacksonTian/eventproxy

validator

功能简介:javascript的验证工具集,支持两种模式:check(校验)/sanitize(处理),同时提供了可扩展的错误处理。
主页地址:http://github.com/chriso/node-validator

ejs

功能简介:embered.jsjavascript 模板引擎(可以跟express集成,作为服务端模板引擎)
主页地址:https://github.com/visionmedia/ejs

loader

功能简介:loader- 资源加载工具,可以区分开发模式、发布模式;在发布模式下可进行资源压缩、合并。以实现减少静态资源带宽并且便于实现客户端缓存
主页地址:https://github.com/TBEDP/loader

canvas

功能简介:canvas - node.js 常用的图形图像处理库,是很多其它库的基础依赖库
主页地址:https://github.com/learnboost/node-canvas

captchagen

功能简介:captchagen-node.js常用验证码图片处理库,依赖上面的canvas库
主页地址:http://github.com/wearefractal/captchagen

crypto-js

功能简介:crypto-js- javascript 常用加密库、hash库封装,支持sha-x / md5 / hash等各种加密、hash算法
主页地址:http://github.com/wearefractal/captchagen

nodemailer

功能简介:nodemailer- 邮件发送工具,支持SMTP等邮件发送协议
主页地址:http://github.com/andris9/nodemailer

qrcode

功能简介:qrcode- node.js服务端的qrcode生成器。支持多种输出类型(dataUrl/file/bitArray)
主页地址:http://github.com/soldair/node-qrcode

pdfkit

功能简介:qrcode- node.js服务端的qrcode生成器。支持多种输出类型(dataUrl/file/bitArray)
主页地址:http://github.com/soldair/node-qrcode

excel

功能简介:excel- node.js excel解析器,支持xlsx(Excel2007+)
主页地址:https://github.com/trevordixon/excel

excel-export

功能简介:excel-export- node.js excel生成器,支持导出excel
主页地址:https://github.com/functionscope/Node-Excel-Export

net-ping

功能简介:net-ping- node.js 对ping的封装,用于测试目标主机是否可达
主页地址:https://bitbucket.org/stephenwvickers/node-net-ping

debug

功能简介:debug- node.js debug工具,对console.log的封装,支持多种颜色输出。
主页地址:https://github.com/visionmedia/debug

项目组织结构



NPM - Node.js 模块依赖管理工具

npm是管理node.js模块依赖的工具,依赖于开源技术的优势就是你有非常多的优秀库可以帮助你快速构建一个系统,但就像一把双刃剑,由于开源导致版本的升级不可控。这时,一个集中性的模块依赖管理工具的优势就十分明显。它负责帮你管理开源项目的版本,你只需要添加对某个开源模块的依赖即可。

unix/linux下安装npm:

curl http://npmjs.org/install.sh | sudo sh

如何在项目中使用npm管理你的依赖:

(1)在项目的根目录下创建一个package.json文件

在dependencies下添加所需要依赖的模块,示例如下: