###一、前言
⋅⋅⋅上节我们基于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
相关推荐
在这个项目中,我们看到“nodejs服务端+mysql+sqlite+log4js”的组合,这代表了四个关键的开发组件。 首先,Node.js是一个开放源代码、跨平台的JavaScript运行环境,它让开发者能够在服务器端执行JavaScript代码。...
这个"一个完整的Node.js项目"是一个实践性极强的学习资源,适合初学者用来提升技能或者熟悉Node.js的全栈开发流程。 1. **项目结构分析** 一个完整的Node.js项目通常包括以下部分: - `package.json`:项目配置...
目前似乎最常见的线上部署nodejs项目的有forever,pm2这两种。 使用场合: supervisor是开发环境用。 forever管理多个站点,每个站点访问量不大,不需要监控。 nodemon 是开发环境使用,修改自动重启。 pm2 网站...
本篇文章将通过一个名为“nodejs-log4j demo”的实例,详细介绍如何在Node.js中使用log4js库来实现日志功能,旨在为初学者提供清晰的指导。 首先,我们要了解log4js。Log4js是基于Java的log4j项目的一个移植,专门...
nodejs进程通信--pm2 cluster方式, pm2版本 2.4.2,node 版本 v7.5.0
NodeJS入门项目案例(Express+Mysql)是一个适合初学者的教程,旨在引导你进入Node.js服务端开发的世界。在这个项目中,我们将使用Express框架,一个简洁且强大的Web应用开发框架,以及Mysql,一个流行的开源关系型...
Idea 配置前端 Web Nodejs 项目 Idea 配置前端 Web Nodejs 项目是指在 IntelliJ IDEA 集成开发环境中配置 Nodejs 项目的步骤。下面我们将详细讲解配置的步骤和相关知识点。 Idea 配置 Nodejs 项目 首先,我们需要...
节点js NodeJS示例项目
pm2Manage nodejs 服务器进程管理工具 version 0.2.3 pm2 manage 是nodejs的服务器管理工具demo目前实现了期监控功能模块依赖 angularjs nodejs less bootstrap 支持IE8 功能展望 目前pm2已经开放了...
我的项目情况是这样的:用node.js做后台,ejs做模板引擎(即整个页面是一个ejs文件)由node.js将数据渲染完成后,再将完整页面返回给用户。 那么这样做会遇到的问题: 1. 本项目没有html页面,ejs的作用也不是引入...
这个"nodeJs练习项目 结构简洁 注释全面"是一个专门为初学者或希望提升Node.js技能的人设计的实践项目。它涵盖了Node.js的基础知识,包括创建服务器、处理HTTP请求以及静态文件服务等核心概念。 项目的目标是实现一...
微信小程序+Nodejs项目实战合集 内含两套完整实战教你全为了解一个小程序的开发流程及步骤
linux指定用户安装nodejs_pm2,pm2日志定时打包_清理_切换moja用户_moja_shell
nodejs基于express框架搭建项目的代码,直接通过127.0.0.1:3000就可以直接访问
Node.js是一种基于Chrome V8引擎的JavaScript运行环境,它允许开发者使用JavaScript进行服务器端编程,打破...通过实践这些项目,开发者可以深入理解Node.js的工作原理,并且掌握如何将JavaScript应用于服务器端开发。
`md5_2.js`和`md5.js`可能是用于实现MD5哈希算法的模块。MD5常用于数据校验和密码加密,是网络安全中的重要工具。这两个文件可能分别代表了不同版本的实现,对比学习可以加深对MD5算法的理解。 `package.json`文件...
本文章针对 log4js v4.3 本文对自己用log4js的技术点简单的做一个记录,有一些技术点没有用到或者写全,会在后面用到的时候进行更新。 先大概的对log4js 的基本用法做一个总结,使用configure()方法对日志输出进行...
nodejs-md5 一个简单的节点模块,可为您提供文件或字符串的MD5。 模仿macOS命令md5 。 安装: npm install nodejs-md5 导入: var md5 = require ( "nodejs-md5" ) ; 用法示例: 要获取文件的MD5: //md5 ./...
【标题】"Node.js项目代码 demo" 是一个关于Node.js实战项目的示例代码,它旨在帮助开发者理解如何在实际环境中运用Node.js进行Web开发。Node.js是一个基于Chrome V8引擎的JavaScript运行环境,以其异步非阻塞I/O和...
总的来说,Node.js客户端音乐播放器项目为开发者提供了一个探索Node.js在音频处理方面应用的实践平台。通过学习和使用相关模块,不仅可以掌握Node.js的实用技能,还可以深入了解音频处理和客户端应用开发。