`
逐行分析JS源代码
  • 浏览: 87850 次
  • 性别: Icon_minigender_1
  • 来自: 杭州
社区版块
存档分类
最新评论

NODEJS项目实践0.4 [domain,pm2,log4js,md5]

阅读更多

###一、前言

 

⋅⋅⋅上节我们基于mongo数据存取的操作,实现了用户注册、登录、退出功能,并应用了初级的权限验证。本节将处理nodejs异常情况、加密、日志及进程守护。

 

#####git : https://github.com/xiaolulu/mynodejs.git

 

###二 、MD5

 

⋅⋅⋅密码作为用户登录唯一凭证,其安全性不言而喻,前面我们的密码操作存在两个问题

 

⋅⋅⋅a、用户登录及注册都使用了明文密码

 

⋅⋅⋅b、数据库保存了用户的明文密码

 

⋅⋅⋅常规可以使用二次加密,即前台传递到后台的密码先加密一次,后台再加密一次后存入数据库。

 

####1、客户端加密

 

⋅⋅⋅下载 md5.js 文件,用require包下。可以到我的git上下载,也是网上找的,加了require

 

⋅⋅⋅该文件较稳定且与业务无关,我们放到 root/static/core/js内

 

⋅⋅⋅在root/static/module/issue/register.js里引用,在password传输前对其加密

 

```javascript

require.config({

baseUrl: basePath,

paths: {

all: 'public/js/all',

md5: 'core/js/md5'//引用md5

}

})

 

define( ['md5','all'], function( md5 ){

    $( '#registerForm' ).on( 'submit', function(){

        var data = {

            username: $('#username').val(),

            password: md5.hex_md5( $('#password').val() ),//对password加密

            email: $('#email').val()  

        }

$.ajax

...

    })

});

```

 

⋅⋅⋅此时通过mongo终端可以看到新注册的密码已经变成32的加密字段如

 

⋅⋅⋅123456 → 'e10adc3949ba59abbe56e057f20f883e'

 

####2、服务器端加密

 

⋅⋅⋅在添加注册数据到数据库的时候,再加密一次

 

⋅⋅⋅nodejs包装的加密模块为 crypto,通过package.json安装

 

⋅⋅⋅对用户数据存取都在root/web/controls/user.js,我们对其修改

 

```javascript

var db = require( '../db/sql' ),

crypto = require( 'crypto' );//引入  crypto 模块

var md5 = function(data) { //定义加密函数

 

    return crypto.createHash('md5').update(data).digest('hex').toLowerCase();  

 

function addUser( req, res ){

    var data = req.body;

data.password = md5( data.password );//对存入的密码加密

    ...

}

 

function findUser( req, res ){

    var data = req.body;

data.password = md5( data.password );//对查询的密码加密

    ...

}

...

```

 

⋅⋅⋅此时我们再看数据库里的同样的密码,变化为另外一种32位的密文

 

⋅⋅⋅如 123456 → '14e1b600b1fd579f47433b88e8d85291'

 

⋅⋅⋅再执行一次注册 / 登录,功能是同样可用的,但密码已经是安全的了。

 

⋅⋅⋅此时我们完成了加密,之所以二次加密是因为,客户端加密防止在向服务器传送的过程中被拦截,服务器再加密是防止内部出错。

 

###三 、nodejs异常处理

 

⋅⋅⋅开发程序难免会出现代码异常,前台js情况还好些,通常只影响当前用户的当前页面,但服务器如果出现异常,则要严重的多,处理不慎会造成整个项目的崩溃,停止服务,所以后台的异常处理要非常全面。

 

⋅⋅⋅js出提供了异常处理机制,就是我们常用的try{}catch(e){},nodejs也可以使用

 

####1、同步异常处理

 

⋅⋅⋅编辑 root/web/routes/index.js,app.use是所有请求的入口,对其做下包装即可,在第二步中展示

 

####2、异步异常处理

 

⋅⋅⋅nodejs最主要的优势在于其非阻塞的IO机制,意味着其内有大量的异步回调,这里的错误是难以捕捉和处理的,也是try..catch所无法达到的,nodejs提供了domain方法,同样在 app.use里做处理

 

```javascript

var domain = require( 'domain' );//引入domain

var Domain = domain.create();

 

Domain.on( 'error', function( e ){//监听异步错误

console.log( 'error ' + e) 

});

app.use( function( req, res, next){

try{

if( privilege[ req.path ] && req.path != '/login' && !req.session.status ){

                if( req.method == 'GET' ){

           res.redirect('/login');

           } else {

               res.send( { code: 1001, msg: 'need you to log in'})    

           }           

   } else {

Domain.run( function(){

next();//包装异步处理,这样回调出错,也不会造成项目崩溃

});

   }

} catch( e ){

res.redirect( '/' );

}

        

    });

 

```

###四、pm2

 

⋅⋅⋅在上一步我们做了异常处理,可以减少项目崩溃的机率,但其还是不够稳妥,下面我们使用进程守护模块。

 

⋅⋅⋅pm2及forever模块是目前较常用的nodejs进程守护模块,前者更常用些、功能也更强大(提供负载)。其原理主要是pm2开启一个主进程,另行再开子进程运行nodejs项目,主进程监听子进程,若子进程崩溃,pm2会自行将其启动,并且也可以对一个项目启动多个子进程,pm2主进程做随机转发请求。

 

####1、安装 npm install pm2 -g

 

⋅⋅⋅其类似于前面我们安装的node-dev,是用于启动项目的,所以要安装在全局

 

####2、常用命令

 

```javascript

pm2 start app.js//启动

pm2 ls//显示已启动的项目进程,会显示项目id / name 负载等信息

pm2 start app.js -i max //自动依赖电脑内核数,尽量启动多的进程

pm2 reload all//重新加载

pm2 restart [ app_name | id | all ]//重启项目,用于改了nodejs代码时,其不具备node-dev功能

pm2 stop  [ app_name | id | all ]//停止某进程

pm2 logs

 

```

###五、log4js

 

⋅⋅⋅后台项目日志是极其重要的,后端不是客户端 js那么明晰,错误可以随时debug,日志是很好的记录,其对所有数据的请求进行记录,也记录了出现危害项目的行为,如修改、删除数据操作。

 

⋅⋅⋅我们使用log4js模块,通过package.json安装

 

⋅⋅⋅在root/web下新建log文件夹存放日志文件

 

⋅⋅⋅log4js还是需要一些简单的配置,前面使用md5及后面会到诸如ip获取等也需要一些简单的配置,我们将这些简单的不需要单独成一个文件的配置都放是一个文件里,新建 root/web/tool/gadget.js,添加代码如下

 

```javascript

var log4js = require( 'log4js' );

//引入log4js

 

var logConfig = {

//设置配置项

"appenders":[

{"type": "console","category":"console"},

{

"type": "dateFile",

"filename":"./log/",

//目录

"pattern":"yyyyMMdd.log",

//命名规则,我们是按天,也可以设置为yyyyMMddhh.log,为按时

"absolute":true,

"alwaysIncludePattern":true,

"category":"logInfo"

}

],

"levels":{"logInfo":"DEBUG"}

}

 

log4js.configure( logConfig );

var logInfo = log4js.getLogger('logInfo');

 

module.exports = {

logInfo: logInfo

}

```

 

⋅⋅⋅我们对所有的请求作记录,在root/web/routes/index.js,里的app.use处添加日志记录

 

```javascript

var gadget = require( '../tool/gadget' );

….

app.use( function( req, res, next){

console.log( req.path );  

gadget.logInfo.info( req.path );

//添加日志,记录所有请求路径

try{

if( privilege[ req.path ] && req.path != '/login' && !req.session.status ){

console.log( req.session.status );

                if( req.method == 'GET' ){

           res.redirect('/login');

           } else {

               res.send( { code: 1001, msg: 'need you to log in'})    

           }           

   } else {

Domain.run( function(){

next();

});

   }

} catch( e ){

gadget.logInfo.error( req.path );

//添加日志,记录出错信息

res.redirect( '/' );

}

        

    })

```

 

⋅⋅⋅项目启动后,可以看到root/web/log下自动新增了 20150723.log文档,具体文件名视当前日期而定。

 

⋅⋅⋅访问我们的站点的任一个页面,日志文件中都会自动多出相应的记录。

 

⋅⋅⋅实时查看文档Linux下可用 tail -f 20150723.log,终端其会自动刷新目录数据。

 

⋅⋅⋅本页的 Domain.on( 'error' )回调里也添加logInfo.error。还有DB的存取等所以有意义的数据往返及操作都可以记录下来

 

 

###六、总结

 

⋅⋅⋅本节我们主要是对nodejs模块的应用,处理异常( domain)、加密了数据(md5)、设置进程守护(pm2) 并 做了日志记录(log4js),每一块只对基础配置使用做了介绍,后面再单独出一章详细nodejs常用模块

 

⋅⋅⋅近来工作较忙,就先写到这里,下节演示nodejs分成前后台两部分接收页面请求及DB存取、git操作

 

#####其它案例可参见: http://www.upopen.cn

 

###全栈工程 - 技术新Q群:435485569

0
1
分享到:
评论
1 楼 mangguo 2015-08-07  
我写的nodejs课程,楼主帮忙看看哈。



http://www.hubwiz.com/course/5359f6f6ec7452081a7873d8/

相关推荐

    nodejs服务端+mysql+sqlite+log4js

    在这个项目中,我们看到“nodejs服务端+mysql+sqlite+log4js”的组合,这代表了四个关键的开发组件。 首先,Node.js是一个开放源代码、跨平台的JavaScript运行环境,它让开发者能够在服务器端执行JavaScript代码。...

    一个完整的nodejs项目

    这个"一个完整的Node.js项目"是一个实践性极强的学习资源,适合初学者用来提升技能或者熟悉Node.js的全栈开发流程。 1. **项目结构分析** 一个完整的Node.js项目通常包括以下部分: - `package.json`:项目配置...

    nodejs高大上的部署方式(PM2)

    目前似乎最常见的线上部署nodejs项目的有forever,pm2这两种。 使用场合: supervisor是开发环境用。 forever管理多个站点,每个站点访问量不大,不需要监控。 nodemon 是开发环境使用,修改自动重启。 pm2 网站...

    nodejs-log4j demo

    本篇文章将通过一个名为“nodejs-log4j demo”的实例,详细介绍如何在Node.js中使用log4js库来实现日志功能,旨在为初学者提供清晰的指导。 首先,我们要了解log4js。Log4js是基于Java的log4j项目的一个移植,专门...

    nodejs进程通信--pm2 cluster方式

    nodejs进程通信--pm2 cluster方式, pm2版本 2.4.2,node 版本 v7.5.0

    NodeJS入门项目案例(Express+Mysql)

    NodeJS入门项目案例(Express+Mysql)是一个适合初学者的教程,旨在引导你进入Node.js服务端开发的世界。在这个项目中,我们将使用Express框架,一个简洁且强大的Web应用开发框架,以及Mysql,一个流行的开源关系型...

    Idea 配置前端web nodejs项目

    Idea 配置前端 Web Nodejs 项目 Idea 配置前端 Web Nodejs 项目是指在 IntelliJ IDEA 集成开发环境中配置 Nodejs 项目的步骤。下面我们将详细讲解配置的步骤和相关知识点。 Idea 配置 Nodejs 项目 首先,我们需要...

    nodejs:NodeJS示例项目

    节点js NodeJS示例项目

    nodejs服务器进程管理工具pm2Manage.zip

    pm2Manage nodejs 服务器进程管理工具 version 0.2.3 pm2 manage 是nodejs的服务器管理工具demo目前实现了期监控功能模块依赖 angularjs nodejs less bootstrap 支持IE8 功能展望 目前pm2已经开放了...

    详解webpack打包nodejs项目(前端代码)

    我的项目情况是这样的:用node.js做后台,ejs做模板引擎(即整个页面是一个ejs文件)由node.js将数据渲染完成后,再将完整页面返回给用户。 那么这样做会遇到的问题: 1. 本项目没有html页面,ejs的作用也不是引入...

    nodeJs练习项目 结构简洁 注释全面

    这个"nodeJs练习项目 结构简洁 注释全面"是一个专门为初学者或希望提升Node.js技能的人设计的实践项目。它涵盖了Node.js的基础知识,包括创建服务器、处理HTTP请求以及静态文件服务等核心概念。 项目的目标是实现一...

    微信小程序+Nodejs项目实战合集

    微信小程序+Nodejs项目实战合集 内含两套完整实战教你全为了解一个小程序的开发流程及步骤

    linux指定用户安装nodejs_pm2,pm2日志定时打包_清理_切换moja用户_moja_shell.zip

    linux指定用户安装nodejs_pm2,pm2日志定时打包_清理_切换moja用户_moja_shell

    express搭建nodejs项目源代码

    nodejs基于express框架搭建项目的代码,直接通过127.0.0.1:3000就可以直接访问

    整理的三个nodejs项目

    Node.js是一种基于Chrome V8引擎的JavaScript运行环境,它允许开发者使用JavaScript进行服务器端编程,打破...通过实践这些项目,开发者可以深入理解Node.js的工作原理,并且掌握如何将JavaScript应用于服务器端开发。

    一套完整的nodejs-web项目.zip

    `md5_2.js`和`md5.js`可能是用于实现MD5哈希算法的模块。MD5常用于数据校验和密码加密,是网络安全中的重要工具。这两个文件可能分别代表了不同版本的实现,对比学习可以加深对MD5算法的理解。 `package.json`文件...

    nodejs log4js 使用详解

    本文章针对 log4js v4.3 本文对自己用log4js的技术点简单的做一个记录,有一些技术点没有用到或者写全,会在后面用到的时候进行更新。 先大概的对log4js 的基本用法做一个总结,使用configure()方法对日志输出进行...

    nodejs-md5:一个简单的节点模块,可为您提供文件或字符串的md5

    nodejs-md5 一个简单的节点模块,可为您提供文件或字符串的MD5。 模仿macOS命令md5 。 安装: npm install nodejs-md5 导入: var md5 = require ( "nodejs-md5" ) ; 用法示例: 要获取文件的MD5: //md5 ./...

    nodejs项目代码 demo

    【标题】"Node.js项目代码 demo" 是一个关于Node.js实战项目的示例代码,它旨在帮助开发者理解如何在实际环境中运用Node.js进行Web开发。Node.js是一个基于Chrome V8引擎的JavaScript运行环境,以其异步非阻塞I/O和...

    nodejs 客户端音乐播放器

    总的来说,Node.js客户端音乐播放器项目为开发者提供了一个探索Node.js在音频处理方面应用的实践平台。通过学习和使用相关模块,不仅可以掌握Node.js的实用技能,还可以深入了解音频处理和客户端应用开发。

Global site tag (gtag.js) - Google Analytics