一、前言

⋅⋅⋅上节我们基于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传输前对其加密

javascriptrequire.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,我们对其修改

javascriptvar 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,添加代码如下

javascriptvar log4js = require( 'log4js' );//引入log4jsvar 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处添加日志记录

javascriptvar 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

NODEJS项目实践0.4 [domain,pm2,log4js,md5]相关推荐

  1. 如何将nodejs项目程序部署到阿里云服务器上

    将nodejs项目程序部署到阿里云服务器上 一.概述 二.具体步骤 1.拥有自己的服务器 2.下载Xshell 3. oneinstack配置web环境 4. XShell连接远程主机 5.更新系统软 ...

  2. 公司项目NODEJS实践0.3[ mongo / session ...]

    一.前言 ⋅⋅⋅书接上回,我们搭建了WEB服务端路由.模板等功能,完成了register 通过ajax与后端的通信,今天主要完成数据与mongodb的存取,实现注册 / 登录 / 退出功能 ⋅⋅⋅DE ...

  3. 在Centos上启动nodejs项目,并使用pm2管理nodejs应用

    node+koa2+mysql入门可以查看这篇文章https://blog.csdn.net/qq_41231694/article/details/123788781 一.在centos上安装nod ...

  4. PM2 部署 nodejs 项目

    PM2 部署 nodejs 项目 在网上找到pm2.目前似乎最常见的线上部署nodejs项目的有forever,pm2这两种. 使用场合: forever管理多个站点,每个站点访问量不大,不需要监控. ...

  5. 手把手教你从0到1进行Java项目实践

    手把手教你从0到1进行Java项目实践 虽说工作就是简单的事情重复做,但不是所有简单的事你都能有机会做的. 我们平日工作里,大部分时候都是在做修修补补的工作,而这也是非常重要的.做好修补工作,做好优化 ...

  6. MySQL 8.0 初学与基础项目实践

    本文主要参考 <SQL必知必会(第四版)> 以及**MySQL 8.0 Reference Manual** 不再更新 --Last update: 2019/05/07:更新项目12 欢 ...

  7. java web 2.0 下载地址_《征服Ajax Web2.0快速入门与项目实践(Java)》[PDF]

    征服Ajax Web2.0快速入门与项目实践(Java) 作者:张桂元 贾燕枫 姜波 基本信息 ·出版社:人民邮电出版社 ·页码:300 页 ·出版日期:2006年 ·ISBN:7115148031 ...

  8. 基于pnpm + lerna + typescript的最佳项目实践 - 理论篇

    本文来自作者@金虹桥程序员 投稿 原文链接:https://juejin.cn/post/7043998041786810398 本系列文章分为两篇:理论篇和实践篇 理论篇:介绍pnpm(pnpm的特 ...

  9. 一台新云主机nodejs项目部署过程

    某云服务商的一个全新的云服务器,系统为centos.需要在上面部署一套系统,包括了java.nodejs等等.本文记录一下与nodejs有关的部署过程.有些操作是熟悉.简单的,但也记录出来,权当流水账 ...

最新文章

  1. 面试官:请简述一下vue-cli命令行工具,你能自己手写一个吗?
  2. 试用memcached高可用repcached
  3. ACM_贪心法_queue_Fence Repair
  4. IT民工系列——c#操作Microsoft IE,实现自动登录吧!
  5. nginx负载均衡配置的几种策略
  6. JMeter场景设置与监控
  7. 血型遗传关系c语言编程,根据血型遗传关系,编程实现:○1.输入
  8. 互联网高级Java面试总结
  9. 3DS MAX的灯光
  10. 内部跳转(请求转发)和外部跳转(重定向)的区别?
  11. SpringBoot_Vue实现电影院售票系统
  12. 秒赞机器人好友_qq空间秒赞机器人好友 qq空间说说秒赞神器
  13. oracle数据库 date函数,Oracle 函数(处置Date)
  14. 数字签名?电子签名?傻傻分不清楚!
  15. vuejs crc算法,16进制换算
  16. 三角波发生器电路图分析
  17. Excel中两表数据核对方法
  18. 拆机详解2:比Macintosh还早?苹果Lisa拆解
  19. Java io流的使用操作
  20. runtime-compiler 与 runtime-only区别

热门文章

  1. c primer plus 5 读书笔记1
  2. Java对象转xml报文和xml报文转Java对象帮助类
  3. 《NoSQL精粹》思维导图读书笔记
  4. GNU make manual 翻译( 一百二十一)
  5. 英语是缺乏AOP的语言,汉语是具备AOP的语言。
  6. Activity的setContentView的流程
  7. Re:从零开始的机器学习 - Machine Learning(一) 线性回归
  8. 人工智能其实并不客观,算法会加剧刻板印象
  9. SQLyog普通版与SQLyog企业版对比分析
  10. 从本机发送信息到另一台服务器上时中文乱码