nodejs 计算文件md5MD5 要怎么弄

Posts - 12,
Articles - 5,
Comments - 50
JAVASCRIPT , ANGULAR.JS , DOJO , NODE.JS
欢迎访问个人博客:
23:23 by Owen Chen, ... 阅读,
本博客停止更新,请访问新个人博客:
这篇文章所使用的例子是基于《node.js开发指南》这本书中的例子和源代码来做的。express从2.x到3.x引入了非常大的变化,很多模块都被独立出去,并且调用的接口也发生了很大的变化,所以原有的代码在express3.x上是不能运行的。在尝试的过程中,做了很多迁移的工作,同时将一些模块进行了一定的分离和整合,使得整个项目更加具有结构性和可扩展性。
这里首先要推荐一下《node.js开发指南》这本书,想学习和使用Node.js的同学,这确实是一本非常全面的介绍Node.js的书籍,看完了之后,结合书中的例子代码,基本可以使用Node进行web应用的开发。
我这里主要结合这个例子,以自己的理解和对例子的修改讲述一下使用Node.js进行web开发的整个过程。 我就直接从代码开始讲,对于环境的搭建,npm包安装,模块引入等大家可以另外找一些文章,或者从《node.js开发指南》这本书的相应章节去了解。
目录结构:
首先贴出目录结构:
从每个文件和文件夹的名字上,相信大家能看出他们各自的功能。
main.js是整个应用的启动文件
settings.js中存放着系统的配置信息
server.js是系统服务配置和创建的地方
db.js是与数据库相关的内容
models模块中中存放着模型类如User,Post等,类似于Java中的Entity
routes中是系统页面跳转和请求分发处理的模块
views是系统展现给用户的页面
daos中分装了所有对数据库的操作,熟悉J2EE的同学应该都理解这一层做的事情
web中是一些静态元素,如html,js,css,images
package.json中定义了系统需要的其他的第三方模块,如express,ejs等
node_modules中则是存放通过npm安装的第三方包的地方
接下来会对这些部分分别做详细的介绍和分析。
基于express和ejs的MVC
在后台的各个模块中其实有一个基于express和ejs的MVC模式。对应的三个模块为:models(M)-views(V)-routes(C),具体会在后面讲解他们三者是如何工作的。
关于express,我在这里不做详细的介绍,大家可以上它的官网做比较详细的了解。简单的讲,就是一套在Node.js上创建web应用的框架。提供了包括服务创建、启动、会话、路由等接口和实现。一个最基本的基于express的服务代码如下:
var express = require('express');
var app = express(); //创建服务
app.get('/', function(req, res){ //路由所有的到根目录的请求
res.send('hello world');
app.listen(3000); //启动服务,监听3000端口
ejs: ejs是一种基于js的模版技术,即通过在html片段中插入js代码。在发送到客户端之前现在服务器端进行解析处理,动态设置一些字段或者添加一些节点。JSP就是一种基于java的模版语言。
在最新的ejs中可以支持以html文件作为模版文件,并且引入了include机制,可以使用include语句来引入其他的页面内容。这点和jsp很像。
一个基于ejs的html文件可以写成如下:
&% include header.html %&
&% if (!locals.user) { %&
&div class="hero-unit"&
&h1&欢迎来到 Microblog&/h1&
&p&Microblog 是一个基于 Node.js 的微博系统。&/p&
&a class="btn btn-primary btn-large" href="/login"&登录&/a&
&a class="btn btn-large" href="/reg"&立即注册&/a&
&% } else { %&
&% include say.html %&
&% include footer.html %&
在使用ejs的时候,可以在js代码中调用res.render('index',{user:"Owen"})方法。这个方法有两个参数,第一个为模版文件的名字,第二个为需要传入到模版中使用的参数。
exports.index = function(req, res) {
res.render('index', {
title: '首页',
posts: posts
在最新的ejs中,加入了作用域的概念,在模版文件中不能直接引用变量名来访问变量,而需要使用locals.xxx来访问相应的变量。这样做是为了避免全局变量的污染和冲突。
在这个MVC模式中主要用到了express的route功能和ejs的模版机制。
在models模块中定义一些模型模块如User,Post等,这些类似与java中的Pojo或者Entity类。定义了模型的一些属性和方法。这些属性与数据库的字段相对应。比如一个简单的User model的模块可以定义如下:
function User(user) {
this.name = user.
this.password = user.
module.exports = U
routes中定义了请求分发处理的过程。比如到所有到根目录(/)的请求都经过一定的处理然后转发到index view中,到/login的请求应该返回login.html页面。这个与j2ee项目中的web.xml或者使用struts时的struts.xml类似。在node中,遵循代码即配置的原则,下面先看一下/routes/index.js模块中的code。
var crypto = require('crypto');
var User = require('../models/User');
var Post = require('../models/Post');
var user = require('./user');
var that =
exports.index = function(req, res) {
Post.get(null, function(err, posts) {
if (err) {
posts = [];
res.render('index', {
title: '首页',
posts: posts
exports.login = function(req, res) {
res.render('login', {
title: '用戶登入',
module.exports = function(app) {
app.get('/', that.index);
app.get('/login', checkNotLogin);
app.get('/login', that.login);
app.post('/login', checkNotLogin);
app.post('/login', that.doLogin);
app.get('/reg', user.reg);
上面的代码片段定义了index函数用来处理所有的到根目录的请求,login函数处理到/login的get请求。 而到注册模块的(/reg)的请求,则被转发到user.reg方法中。在route/user模块中,我们可以定义跟user相关的一些处理函数,如:
var crypto = require('crypto');
var User = require('../models/User');
var UserDao = require('../daos/UserDao');
var PostDao = require('../dao/PostDao');
exports.view = function(req, res) {
UserDao.get(req.params.user, function(err, user) {
if (!user) {
req.flash('error', '用户不存在');
return res.redirect('/');
PostDao.get(user.name, function(err, posts) {
if (err) {
req.flash('error', err);
return res.redirect('/');
res.render('user', {
title: user.name,
posts: posts,
exports.reg = function(req, res) {
res.render('reg', {
title: '用户注册',
通过将处理函数的拆分和封装,可以很好的让这些route模块起到类似java中的servlet或者service的作用。
Views中则是将要返回给客户端展示的内容,route中通过对model的处理,将处理结果或者model的内容通过ejs的方式植入到html页面中返回给客户端。
&routes-&models-&daos
routes作为请求接收分发的模块,在接收到请求之后调用models中的接口处理数据,在models中通过daos中的数据库操作接口完成对数据库数据的查询活更改。这样三个层次各自的职责以及之间的依赖关系就非常明确。拿注册过程举例,典型的调用如下:
routes/index.js
app.post('/login', checkNotLogin);
app.post('/login', user.doLogin);
routes/user.js
exports.doLogin = function(req, res) {
//生成口令的散列值
var md5 = crypto.createHash('md5');
var password = md5.update(req.body.password).digest('base64');
User.get(req.body.username, function(err, user) {
if (!user) {
req.flash('error', '用户不存在');
return res.redirect('/login');
if (user.password != password) {
req.flash('error', '密码错误');
return res.redirect('/login');
req.session.user =
req.flash('success', '登录成功');
res.redirect('/');
models/User.js
var UserDao = require('../daos/UserDao');
User.get = function get(username, callback) {
UserDao.get(username, callback);
daos/UserDao.js
exports.get = function get(username, callback) {
mongodb.open(function(err, db) {
if (err) {
return callback(err);
db.collection('users', function(err, collection) {
if (err) {
mongodb.close();
return callback(err);
collection.findOne({name: username}, function(err, doc) {
mongodb.close();
if (doc) {
var user = new User(doc);
callback(err, user);
callback(err, null);
服务配置和启动
main.js是系统启动的文件,在终端使用:node main.js将启动整个web应用。&
var server = require('./server');
server.start();
我的这个文件中代码很简单,我将服务的配置和创建过程移到了server.js中:
var express = require('express');
var ejs = require('ejs');
var flash = require('connect-flash');
var MongoStore = require('connect-mongo')(express);
var settings = require('./settings');
var routes = require('./routes');
var app = express();
app.configure(function() {
console.log(__dirname);
app.set('views', __dirname + '/views');
// app.set('view engine', 'ejs');
app.engine('.html', ejs.__express);
app.set('view engine', 'html');
app.use(express.bodyParser());
app.use(flash());
app.use(express.methodOverride());
app.use(express.cookieParser());
app.use(express.session({
secret: settings.cookieSecret,
store: new MongoStore({
db: settings.db
app.use(function(req, res, next) {
res.locals.error = req.flash('error').toString();
res.locals.success = req.flash('success').toString();
res.locals.user = req.session ? req.session.user : null;
app.use(app.router);
routes(app);
app.use(express.static(__dirname + '/web'));
app.configure('development', function() {
app.use(express.errorHandler({
dumpExceptions: true,
showStack: true
app.configure('production', function() {
app.use(express.errorHandler());
exports.start = function() {
app.listen(settings.port);
console.log("Express server listening on port %d in %s mode", settings.port, app.settings.env);
这里重点介绍几个关键的地方:
app.engine('.html', ejs.__express);
app.set('view engine', 'html');
这两句设置让ejs将.html文件作为模版文件。
app.use(flash());
express3.0以后移除了req.flash()方法,所以只有通过使用'connect-flash'中间件模块才能继续使用req.flash()方法。
app.use(function(req, res, next) {
  res.locals.error = req.flash('error').toString();
  res.locals.success = req.flash('success').toString();
  res.locals.user = req.session ? req.session.user :
  next();
由于express3.0移除了app.dynamicHelper()接口,所以要继续使用类似的功能,可以使用如上的代码,将flash或者session中的内容动态绑定到locals局部对象上。这样在模版文件中可以直接使用locals.xxx的方式来访问到这些变量。
到这里项目中比较关键的代码部分都介绍完了,项目代码我放到了github上:/owenXin/microblogByOwen
我本地win7环境运行正常(记得起mongodb哦 )。这是我第一次在Node上做项目,只是初步设想的结构,欢迎大家一起交流,提供宝贵的意见和建议。
本博客停止更新,请访问新个人博客:请问,nodejs MD5 要怎么弄? - CNode技术社区
这家伙很懒,什么个性签名都没有留下。
我需要计算一个字符串的 md5 值。
像 php 就是直接提供了 md5(‘xxxxxxx’) 函数。
看了 node 的Crypto 模块。
有些摸不着头脑。
麻烦谁给解答一下。谢谢!
你可以直接看nodeclub源代码…
var crypto = require('crypto');
exports.encrypt = function (str, secret) {
var cipher = crypto.createCipher(‘aes192’, secret);
var enc = cipher.update(str, ‘utf8’, ‘hex’);
enc += cipher.final(‘hex’);
exports.decrypt = function (str, secret) {
var decipher = crypto.createDecipher(‘aes192’, secret);
var dec = decipher.update(str, ‘hex’, ‘utf8’);
dec += decipher.final(‘utf8’);
exports.md5 = function (str) {
var md5sum = crypto.createHash(‘md5’);
md5sum.update(str);
str = md5sum.digest(‘hex’);
exports.randomString = function (size) {
size = size || 6;
var code_string = ‘ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz’;
var max_num = code_string.length + 1;
var new_pass = ‘’;
while (size & 0) {
new_pass += code_string.charAt(Math.floor(Math.random() * max_num));
return new_
我照教材这样写:
var crypto = require(‘crypto’);
var md5 = crypto.createHash(‘md5’);
var password = md5.update(‘abcdefg’).digest(‘base64’);
console.log(password);
然后输出了
esZsDxSN6VGbi9JkMSxNZA==
不过我也不太懂是什么意思,也不知道这个是不是对的,还有要怎么整的,你弄明白顺便跟我说声哈,学习学习。。。
这个学不会的人,你可以考虑为别的行业做贡献了.
楼主可以标明&新手提问&的…
var crypto = require('crypto');
function md5 (text) {
return crypto.createHash('md5').update(text).digest('hex');
官方说的好明白了- -
用 MD5 库吧
推荐一个工具库
crypto要注意中文的md5,要使用binary否则不相等
update(“中文”, ‘utf8’)
utf8 别少了
md5 不安全吧。
CNode 社区为国内最专业的 Node.js 开源技术社区,致力于 Node.js 的技术研究。
服务器赞助商为
,存储赞助商为
,由提供应用性能服务。
新手搭建 Node.js 服务器,推荐使用无需备案的  上一篇学习了一些构建网站会用到的一些知识点 &&/zhongweiv/p/nodejs_express_webapp1.html
  这一篇主要结合前面讲到的知识,去构建一个较为完整的网站应用程序,对前面学到的一些知道做一个串联加深并灵活运用!
  功能主要用MySQL数据库,包括登录、注册、主页三部分;下面就一步步开始吧! 新建项目、建立数据库以及其它准备工作
  1.新建express + ejs 项目:sampleEjs
cd 工作目录
express -e sampleEjs
cd sampleEjs && npm install
  2.创建数据库 (还第四篇数据库一致:&/zhongweiv/p/nodejs_mysql.html)
CREATE DATABASE IF NOT EXISTS nodesample CHARACTER SET UTF8;
SET FOREIGN_KEY_CHECKS=0;
DROP TABLE IF EXISTS `userinfo`;
CREATE TABLE `userinfo` (
`Id` int(11) NOT NULL AUTO_INCREMENT COMMENT '主键',
`UserName` varchar(64) NOT NULL COMMENT '用户名',
`UserPass` varchar(64) NOT NULL COMMENT '用户密码',
PRIMARY KEY (`Id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COMMENT='用户信息表';
  3.修改package.json文件,安装session和mysql模块
&name&: &sampleEjs&,
&version&: &0.0.1&,
&private&: true,
&scripts&: {
&start&: &node ./bin/www&
&dependencies&: {
&express&: &~4.0.0&,
&static-favicon&: &~1.0.0&,
&morgan&: &~1.0.0&,
&cookie-parser&: &~1.0.1&,
&body-parser&: &~1.0.0&,
&debug&: &~0.7.4&,
&ejs&: &~0.8.5&, &express-session& : &latest&, &mysql& : &latest&
  主要是标红部分(mysql如果是在这篇文章 /zhongweiv/p/nodejs_mysql.html&中按照我的步骤安装过了的,其实可以不用再安装),然后在cmd中运行
npm install
  安装完成后,打开app.js文件,添加如下代码
var express = require('express');
var path = require('path');
var favicon = require('static-favicon');
var logger = require('morgan');
var cookieParser = require('cookie-parser');
var bodyParser = require('body-parser');
var session = require('express-session');
//这里传入了一个密钥加session id
app.use(cookieParser('Wilson'));
//使用靠就这个中间件
app.use(session({ secret: 'wilson'}));
  4.样式和JQuery文件
  样式:  样式主要使用了bootstrap 3.0.3 &
  JQuery: & & jquery &1.11.1 & &        
  添加以上文件到项目中,目录结构如下
  不在bootstrap包中两个css文件样式如下:
min-height: 2000
.navbar-static-top {
margin-bottom: 19
padding-top: 40
padding-bottom: 40
background-color: #
.form-signin {
max-width: 330
padding: 15
.form-signin .form-signin-heading,
.form-signin .checkbox {
margin-bottom: 10
.form-signin .checkbox {
font-weight:
.form-signin .form-control {
font-size: 16
padding: 10
-webkit-box-sizing: border-
-moz-box-sizing: border-
box-sizing: border-
.form-signin .form-control:focus {
z-index: 2;
.form-signin input[type=&text&] {
margin-bottom: 10
border-bottom-left-radius: 0;
border-bottom-right-radius: 0;
.form-signin input[type=&password&] {
margin-bottom: 10
border-top-left-radius: 0;
border-top-right-radius: 0;
  5.清理项目冗余文件,并添加监听
   删除自带的style.css文件
   删除routes目录下user.js文件,并在app.js中删除如下代码
var users = require('./routes/users');
app.use('/users', users);
   &app.js文件中添加8000端口监听
app.listen(8000);
  到这里,示例环境准备完毕! 规划路由,并新建相关文件
  1.路由
  首页:/
  注册页:/reg
  登录页:/login
  安全退出:/logout
  (红色表示需要新建的)
  2.routes目录下新建如下文件
  reg.js
  login.js
  logout.js
  3.views目录下新建:
  header.ejs
  reg.ejs
  login.ejs
  4.打开app.js文件,添加如下代码
var routes = require('./routes/index');
var reg = require('./routes/reg');
var login = require('./routes/login');
var logout = require('./routes/logout');
app.use('/', routes);
app.use('/reg', reg);
app.use('/login', login);
app.use('/logout', logout);
实现登录和注册需要的数据访问方法
  我们新建一个models文件夹,在其中新建user.js,实例代码如下
var mysql = require('mysql');
var DB_NAME = 'nodesample';
= mysql.createPool({
: '192.168.0.200',
password : 'abcd'
pool.on('connection', function(connection) {
connection.query('SET SESSION auto_increment_increment=1');
function User(user){
this.username = user.
this.userpass = user.
module.exports = U
pool.getConnection(function(err, connection) {
var useDbSql = &USE & + DB_NAME;
connection.query(useDbSql, function (err) {
if (err) {
console.log(&USE Error: & + err.message);
console.log('USE succeed');
//保存数据
User.prototype.save = function save(callback) {
var user = {
username: this.username,
userpass: this.userpass
var insertUser_Sql = &INSERT INTO userinfo(id,username,userpass) VALUES(0,?,?)&;
connection.query(insertUser_Sql, [user.username, user.userpass], function (err,result) {
if (err) {
console.log(&insertUser_Sql Error: & + err.message);
connection.release();
console.log(&invoked[save]&);
callback(err,result);
//根据用户名得到用户数量
User.getUserNumByName = function getUserNumByName(username, callback) {
var getUserNumByName_Sql = &SELECT COUNT(1) AS num FROM userinfo WHERE username = ?&;
connection.query(getUserNumByName_Sql, [username], function (err, result) {
if (err) {
console.log(&getUserNumByName Error: & + err.message);
connection.release();
console.log(&invoked[getUserNumByName]&);
callback(err,result);
//根据用户名得到用户信息
User.getUserByUserName = function getUserNumByName(username, callback) {
var getUserByUserName_Sql = &SELECT * FROM userinfo WHERE username = ?&;
connection.query(getUserByUserName_Sql, [username], function (err, result) {
if (err) {
console.log(&getUserByUserName Error: & + err.message);
connection.release();
console.log(&invoked[getUserByUserName]&);
callback(err,result);
  有这三个方法,基本登录注册就够了^_^! 注册
  1.先来布局一下HTML和CSS,加上前端验证及一些提示信息显示(reg.ejs)
&!DOCTYPE html&
&meta charset=&utf-8&&
&meta http-equiv=&X-UA-Compatible& content=&IE=edge&&
&meta name=&viewport& content=&width=device-width, initial-scale=1.0&&
&title&&%= title %&&/title&
&link rel=&stylesheet& type=&text/css& href=&/stylesheets/bootstrap.min.css& /&
&link rel=&stylesheet& type=&text/css& href=&/stylesheets/signin.css& /&
&div id=&container& class=&container&&
&% if (locals.success) { %&
&div id=&alt_sucess& class=&alert alert-success&&
&%- success %&
&% if (locals.error) { %&
&div id=&alt_warning& class=&alert alert-warning&&
&%= error %&
&form class=&form-signin& role=&form& method=&post&&
&h2 class=&form-signin-heading&&注册&/h2&
&input id=&txtUserName& name=&txtUserName& type=&text& class=&form-control& placeholder=&用户名& required autofocus /&
&input id=&txtUserPwd& name=&txtUserPwd& type=&password& class=&form-control& placeholder=&密码& required/&
&input id=&txtUserRePwd&
name=&txtUserRePwd& type=&password& class=&form-control& placeholder=&重复密码& required/&
&button id=&btnSub& class=&btn btn-lg btn-primary& type=&submit&&注
册&/button&
&a class=&btn btn-link& href=&/login& role=&button&&登
&script src=&/javascripts/jquery-1.11.1.min.js& type=&text/javascript&&&/script&
&script type=&text/javascript&&
String.prototype.format = function (args) {
var result =
if (arguments.length & 0) {
if (arguments.length == 1 && typeof (args) == &object&) {
for (var key in args) {
if (args[key] != undefined) {
var reg = new RegExp(&({& + key + &})&, &g&);
result = result.replace(reg, args[key]);
for (var i = 0; i & arguments. i++) {
if (arguments[i] != undefined) {
var reg = new RegExp(&({)& + i + &(})&, &g&);
result = result.replace(reg, arguments[i]);
$(function(){
$('#btnSub').on('click',function(){
$txtUserName = $('#txtUserName'),
txtUserNameVal = $.trim($txtUserName.val()),
$txtUserPwd = $('#txtUserPwd'),
txtUserPwdVal = $.trim($txtUserPwd.val()),
$txtUserRePwd = $('#txtUserRePwd'),
txtUserRePwdVal = $.trim($txtUserRePwd.val()),
errorTip = '&div id=&errorTip& class=&alert alert-warning&&{0}&/div& ';
$(&#errorTip,#alt_sucess,#alt_warning&).remove();
if(txtUserNameVal.length == 0)
$(&#container&).prepend(errorTip.format('用户名不能为空'));
$txtUserName.focus();
if(txtUserPwdVal.length == 0)
$(&#container&).prepend(errorTip.format('密码不能为空'));
$txtUserPwd.focus();
if(txtUserRePwdVal.length == 0)
$(&#container&).prepend(errorTip.format('重复密码不能为空'));
$txtUserRePwd.focus();
if(txtUserPwdVal != txtUserRePwdVal)
$(&#container&).prepend(errorTip.format('两次密码不一致'));
$txtUserPwd.focus();
  2.实现注册功能(reg.js)
var express = require('express'),
router = express.Router(),
User = require('../models/user.js'),
crypto = require('crypto'),
TITLE_REG = '注册';
router.get('/', function(req, res) {
res.render('reg',{title:TITLE_REG});
router.post('/', function(req, res) {
var userName = req.body['txtUserName'],
userPwd = req.body['txtUserPwd'],
userRePwd = req.body['txtUserRePwd'],
md5 = crypto.createHash('md5');
userPwd = md5.update(userPwd).digest('hex');
var newUser = new User({
username: userName,
userpass: userPwd
//检查用户名是否已经存在
User.getUserNumByName(newUser.username, function (err, results) {
if (results != null && results[0]['num'] & 0) {
err = '用户名已存在';
if (err) {
res.locals.error =
res.render('reg', { title: TITLE_REG });
newUser.save(function (err,result) {
if (err) {
res.locals.error =
res.render('reg', { title: TITLE_REG });
if(result.insertId & 0)
res.locals.success = '注册成功,请点击
&a class=&btn btn-link& href=&/login& role=&button&& 登录 &/a&' ;
res.locals.error =
res.render('reg', { title: TITLE_REG });
module.exports =
  3.运行查看效果(命令行中cd到项目根目录,运行: node app)
  运行程序后,在浏览器中输入: &http://localhost:8000/reg & ,运行后如下图
  前端提示如下图:
  注册成功后提示与检查数据库中插入数据!
  到这里,注册功能完成(比如判断用户名是否已存在等情况显示就不列举了,自已写出来运行再看!) 登录
  1.先来布局一下HTML和CSS,加上前端验证及一些提示信息显示(login.ejs)
&!DOCTYPE html&
&meta charset=&utf-8&&
&meta http-equiv=&X-UA-Compatible& content=&IE=edge&&
&meta name=&viewport& content=&width=device-width, initial-scale=1.0&&
&title&&%= title %&&/title&
&link rel=&stylesheet& type=&text/css& href=&/stylesheets/bootstrap.min.css& /&
&link rel=&stylesheet& type=&text/css& href=&/stylesheets/signin.css& /&
&div id=&container& class=&container&&
&% if (locals.success) { %&
&div id=&alt_sucess& class=&alert alert-success&&
&%- success %&
&% if (locals.error) { %&
&div id=&alt_warning& class=&alert alert-warning&&
&%= error %&
&form class=&form-signin& role=&form& method=&post&&
&h2 class=&form-signin-heading&&登录&/h2&
&input id=&txtUserName& name=&txtUserName& type=&text& class=&form-control& placeholder=&用户名& required autofocus /&
&input id=&txtUserPwd& name=&txtUserPwd& type=&password& class=&form-control& placeholder=&密码& required/&
&label class=&checkbox&&
&input name=&chbRem& id=&chbRem& type=&checkbox& value=&remember-me&& 记住密码
&button id=&btnSub& class=&btn btn-lg btn-primary& type=&submit&&登
录&/button&
&a class=&btn btn-link& href=&/reg& role=&button&&注
&script src=&/javascripts/jquery-1.11.1.min.js& type=&text/javascript&&&/script&
&script type=&text/javascript&&
String.prototype.format = function (args) {
var result =
if (arguments.length & 0) {
if (arguments.length == 1 && typeof (args) == &object&) {
for (var key in args) {
if (args[key] != undefined) {
var reg = new RegExp(&({& + key + &})&, &g&);
result = result.replace(reg, args[key]);
for (var i = 0; i & arguments. i++) {
if (arguments[i] != undefined) {
var reg = new RegExp(&({)& + i + &(})&, &g&);
result = result.replace(reg, arguments[i]);
$(function(){
$('#btnSub').on('click',function(){
$txtUserName = $('#txtUserName'),
txtUserNameVal = $.trim($txtUserName.val()),
$txtUserPwd = $('#txtUserPwd'),
txtUserPwdVal = $.trim($txtUserPwd.val()),
errorTip = '&div id=&errorTip& class=&alert alert-warning&&{0}&/div& ';
$(&#errorTip,#alt_warning&).remove();
if(txtUserNameVal.length == 0)
$(&#container&).prepend(errorTip.format('用户名不能为空'));
$txtUserName.focus();
if(txtUserPwdVal.length == 0)
$(&#container&).prepend(errorTip.format('密码不能为空'));
$txtUserPwd.focus();
  2.再来完成后端代码(包括保存session和cookies记录密码)
var express = require('express'),
router = express.Router(),
User = require('../models/user.js'),
crypto = require('crypto'),
TITLE_LOGIN = '登录';
router.get('/', function(req, res) {
res.render('login',{title:TITLE_LOGIN});
router.post('/', function(req, res) {
var userName = req.body['txtUserName'],
userPwd = req.body['txtUserPwd'],
isRem = req.body['chbRem'],
md5 = crypto.createHash('md5');
User.getUserByUserName(userName, function (err, results) {
if(results == '')
res.locals.error = '用户不存在';
res.render('login',{title:TITLE_LOGIN});
userPwd = md5.update(userPwd).digest('hex');
if(results[0].UserName != userName || results[0].UserPass != userPwd)
res.locals.error = '用户名或密码有误';
res.render('login',{title:TITLE_LOGIN});
console.log(1);
res.cookie('islogin', userName, { maxAge: 60000 });
res.locals.username = userN
req.session.username = res.locals.
console.log(req.session.username);
res.redirect('/');
module.exports =
  3.运行查看效果
  运行程序后,在浏览器中输入: &http://localhost:8000/login & ,运行后如下图
  提示效果如下:
  登录成功后,会跳转到首页,下面我们就着手把首页完成! 首页
  首页主要为了测试登录注册的功能是否可可用,虽然首页基本没什么功能,但是我还是把它头部放到了header.ejs文件中!
  1.头部HTML和CSS
&div class=&navbar navbar-default navbar-static-top& role=&navigation&&
&div class=&container&&
&div class=&navbar-header&&
&a class=&navbar-brand& href=&/&&Porschev - Nodejs + Express + Ejs + MySQL + Bootstrap 示例&/a&
&div class=&navbar-collapse collapse&&
&ul class=&nav navbar-nav navbar-right&&
&% if (locals.username) { %&
&li&&a href=&#&&
&%= username %&
&li&&a href=&/logout&&安全退出&/a&&/li&
  2.index.ejs
&!DOCTYPE html&
&meta charset=&utf-8&&
&meta http-equiv=&X-UA-Compatible& content=&IE=edge&&
&meta name=&viewport& content=&width=device-width, initial-scale=1.0&&
&title&&%= title %&&/title&
&link rel=&stylesheet& type=&text/css& href=&/stylesheets/bootstrap.min.css& /&
&link rel=&stylesheet& type=&text/css& href=&/stylesheets/navbar-static-top.css& /&
&% include header %&
  3.index.js实现(主要是cookies,session登录状态判断)
var express = require('express'),
router = express.Router();
router.get('/', function(req, res) {
if(req.cookies.islogin)
console.log('cookies:' + req.cookies.islogin);
req.session.username = req.cookies.
if(req.session.username)
console.log('session:' + req.session.username);
res.locals.username = req.session.
res.redirect('/login');
res.render('index',{title:'主页'});
module.exports =
  4.运行,登录后,查看效果
  登录,不勾选自动登录,运行http://localhost:8000 会自动跳到登录页
  输入正确的用户名和密码登录成功后,页面显示如下(右上角的部分显示了用户名)
  关闭浏览器,再次输入http://localhost:8000 ,跳转到登录页,需要重新登录!
  再次登录,勾选自动登录
  进行首页如上图;
  关闭浏览器,再次输入http://localhost:8000,不会跳转到登录页,而是直接登录了!(cookies起了作用)
  关闭浏览器,过一分钟后,再输入http://localhost:8000 ,跳转到登录页 (cookies失效) 安全退出
  安全退出主要就是清除session(logout.js)
var express = require('express'),
router = express.Router();
router.get('/', function(req, res) {
req.session.destroy();
res.redirect('/login');
module.exports =
  实现效果:在不是自动登录的情况下,登录后点击安全退出,不关闭浏览器,通过url再访问首页,无法直接进入,会跳转到登录页! 前言
  这一篇主要是对前面所学的知识的运用,把零散的知识能真正变成能帮助你实现功能的技能!
  示例并没有过多去优化代码,有很多可优化的部分,在学习的过程中去思考提升,比如:
  1.怎么把代码写的更高效和优美
  2.如果登录验证的部分都像index.js里那么写,那页多了怎么办?
  3.像header.ejs一样的提取页面公共部分怎么才能做得更好
  提示:
  1.上面示例中我提到了“自动登录”,而我写的是“记录密码”,大家就当自动登录来用吧^_^!&
  2.关于session和cookies的实现登录和自动登录部分,示例主要为了体现运用,太懒没有去按照实际规格去完成,有过web开发经验的应该都知道怎么去做以及该存储什么信息,实在不清楚的留言或邮件给我吧!}

我要回帖

更多关于 nodejs md5 的文章

更多推荐

版权声明:文章内容来源于网络,版权归原作者所有,如有侵权请点击这里与我们联系,我们将及时删除。

点击添加站长微信