项目创建后,我们来做个登录注册实例,详细操作步骤如下。

1、新建项目demo ,具体操作步骤参考上一章内容

https://www.cnblogs.com/Anlycp/

2、添加mysql和session包

  • package.json dependencies中添加下面内容后输入npm install进行安装

"mysql": "latest",
"express-session" : "latest",

  • 输入下面语句进行和上面功能相同(多个安装包空格隔开)

npm install mysql express-session –save

3、app.js 添加session配置

var session = require('express-session');

// 设置 Session

//位置必须写在app.use('/', routes);前,否则下面中req.session.user 赋值时会报 TypeError: Cannot set property 'user' of undefined错误
app.use(session({
     secret: '12345',
     name: 'demo',   //这里的name值得是cookie的name,默认cookie的name是:connect.sid
     cookie: {maxAge: 80000 },  //设置maxAge是80000ms,即80s后session和相应的cookie失效过期
     resave: false,
     saveUninitialized: true,
}));

4、创建数据库及用户表

CREATE DATABASE IF NOT EXISTS nodedb CHARACTER SET UTF8;

USE nodedb;

SET FOREIGN_KEY_CHECKS=0;

DROP TABLE IF EXISTS `userinfo`;

CREATE TABLE `userinfo` (
`userid` int(11) NOT NULL AUTO_INCREMENT COMMENT '主键',
`username` varchar(64) NOT NULL COMMENT '用户名',
`userpwd` varchar(64) NOT NULL COMMENT '用户密码',
PRIMARY KEY (`userid`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COMMENT='用户信息表';

5、新建models文件夹,创建user.js文件  用户数据库连接池连接及用户登录注册方法

var mysql = require('mysql');

var DB_NAME= 'nodedb';

//创建连接池 createPool(Object)
// Object和createConnection参数相同。
var pool = mysql.createPool({
host : '127.0.0.1',
user : 'root',
password :'caip',
database:'nodedb',
port : 3306
});
//可以监听connection事件,并设置session值
pool.on('connnection',function(connection){
console.log("pool on");
connection.query('SET SESSION auto_increment_increment=1')
}); function User(user){
this.username = user.username;
this.userpwd = user.userpwd;
} User.prototype.userSave = function save(callback){
var user = {
username : this.username,
userpwd : this.userpwd
};
var INSERT_USER= "INSERT INTO USERINFO (USERID,USERNAME,USERPWD) VALUES (0,?,?)";
pool.getConnection(function(err,connection){
connection.query(INSERT_User,[user.username,user.userpwd],function(err,result){
if(err){
console.log("INSERT_USER Error: " + err.message);
return;
}
connection.release();
callback(err,result);
});
});
}; //根据用户名得到用户数量
User.prototype.userNum = function(username, callback) {
pool.getConnection(function(err,connection){
console.log("getConnection");
console.log("getUserNumByName");
var SELECT_NUM = "SELECT COUNT(1) AS num FROM USERINFO WHERE USERNAME = ?";
connection.query(QUERY_Num, [username], function (err, result) {
if (err) {
console.log("SELECT_NUM Error: " + err.message);
return;
}
connection.release();
callback(err,result);
});
});
}; User.prototype.userInfo = function(callback){
var user = {
username : this.username,
userpwd : this.userpwd
};
var SELECT_LOGIN ="SELECT * FROM USERINFO WHERE USERNAME = ?";
pool.getConnection(function(err,connection){
connection.query(QUERY_LOGIN,[user.username],function(err,result){
if (err) {
console.log("SELECT_LOGIN Error: " + err.message);
return;
}
connection.release();
callback(err,result);
});
});
}
module.exports = User;

6、页面目录及详细代码

index 登录及注册链接跳转

main 登录成功系统界面 调用session显示登录用户信息

regist 注册

index.html

<!DOCTYPE html>
<html>
<head>
<title>登录界面</title>
<link rel='stylesheet' href='/stylesheets/style.css' />
</head>
<body>
<form action="/" method="post">
<div class="form-group">
<div class="form-name left">
<label>用户名</label>
</div>
<input type="text" name="username" class="form-input left"/>
</div>
<div class="form-group">
<div class="form-name left">
<label>密码</label>
</div>
<input type="password" name="password" class="form-input left"/>
</div>
<div class="form-btn">
<input type="submit" value="登录" />
<input type="button" value="注册" onclick="getRegist()" />
</div>
<div class="form-btn">
<label class="warn"><%=errMsg %></label>
</div>
</form>
<script type="text/javascript">
function getRegist(){
location.href = "/regist";
}
</script>
</body>
</html>

index.js

var express = require('express');
var router = express.Router();
var User = require("../models/user.js"); /* GET home page. */
router.get('/', function(req, res, next) {
res.render('index',{ errMsg: '' });
}); router.post("/",function(req, res) {
//获取form表单提交的登录数据
var username = req.body.username;
var password = req.body.password;
var loginUser = new User({
username : username,
userpwd : password
});
//通过用户名取到用户信息
loginUser.userInfo(function(err,result){
if(err){
res.render('index', {errMsg: err });
return;
}
if(result == ''){
res.render('index', {errMsg: '用户不存在' });
return;
}
else{
//判断用户密码是否填写正确 演示没做加密,等有时间再加
if(result[0]['userpwd'] == password){
var user = {'username':username};
req.session.user = user;//保存用户session信息
res.redirect('/main');
}
else{
res.render('index', {errMsg: '密码有误' });
}
}
});
}); module.exports = router;

main.html

<!DOCTYPE html>
<html>
<head>
<title>系统界面</title>
<link rel='stylesheet' href='/stylesheets/style.css' />
<script src="/javascripts/jquery.min.js" type="text/javascript"></script>
</head>
<body>
欢迎 <%= username %>
</body>

main.js

var express = require('express');
var router = express.Router(); /* GET home page. */
router.get('/', function(req, res, next) {
var user = req.session.user;
res.render('main', { username:user.username});
}); module.exports = router;

regist.html

<!DOCTYPE html>
<html>
<head>
<title>注册</title>
<link rel='stylesheet' href='/stylesheets/style.css' />
</head>
<body>
<form action="/regist" method="post">
<div class="form-group">
<div class="form-name left">
<label>用户名</label>
</div>
<input type="text" name="username" class="form-input left"/>
</div>
<div class="form-group">
<div class="form-name left">
<label>密码</label>
</div>
<input type="password" name="password" class="form-input left"/>
</div>
<div class="form-btn">
<input type="submit" value="注册" />
</div>
<div class="form-btn">
<label class="warn"><%= errMsg %></label>
</div>
<% if(locals.status=="success"){ %>
<div class="form-btn">
注册成功,请点击<a href='/' >登录</a>
</div>
<%} %>
</form>
</body>
</html>

regist.js

var express = require('express');
var router = express.Router();
var User = require("../models/user.js"); /* GET home page. */
router.get('/', function(req, res, next) {
res.render('regist', {errMsg:""});
}); router.post('/',function(req, res) {
var username = req.body.username;
var password = req.body.password;
var newUser = new User({
username : username,
userpwd : password
});
//检查用户名是否已经存在
newUser.userNum(newUser.username, function (err, results) {
if (results != null && results[0]['num'] > 0) {
err = '用户名已存在';
} if (err) {
res.render('regist', {errMsg: err });
return;
}
newUser.userSave(function(err,result){
if(err){
res.render('regist', {errMsg: err });
return;
}
if(result.insertId > 0){
res.locals.status = "success";
res.render('regist', {errMsg:'' });
}
else{
res.render('regist', {errMsg: err });
}
});
});
}); module.exports = router;

代码下载地址:

http://download.csdn.net/detail/caiping07/9618977

Nodejs学习总结 -Express 登录注册示例(二)的更多相关文章

  1. 使用Struts2搭建登录注册示例

    使用Struts2来搭建mvc网站框架还是比较容易的,Struts2提供了各项辅助功能,保证了web开发的快速方便.下面使用struts2来搭建一个登录注册示例. 0 项目结构截图 1 搭建Strut ...

  2. nodejs 学习(4) express+mongoose

    一.关于安装和启动: 1.设置环境变量:D:\Program Files\MongoDB\bin 2.启动时需要cd到bin 目录,然后 mongod --dbpath "D:\mongdb ...

  3. Nodejs学习总结 -Express入门(一)

    Express是基于Node.js平台开发的Web应用开发框架,下面我们入手学习. 官网 : http://www.expressjs.com.cn/ github:https://github.co ...

  4. nodejs 学习六 express 三种查询url参数方法

    req.param() 是被废弃的api req.params 俗点:取带冒号的参数 req.body 可以肯定的一点是req.body一定是post请求,express里依赖的中间件必须有bodyP ...

  5. nodejs学习(3) express+socket.io

    //node var express=require('express'); var app = express(); var server = require('http').createServe ...

  6. nodeJs学习-07 express、body-parser;链式操作next

    express和body-parser   const express=require('express'); const bodyParser=require('body-parser'); var ...

  7. Nodejs学习笔记(七)--- Node.js + Express 构建网站简单示例

    目录 前言 新建项目.建立数据库以及其它准备工作 新建express + ejs 项目:sampleEjs 创建数据库 修改package.json文件,安装session和mysql模块 样式和JQ ...

  8. Nodejs学习笔记(七)—Node.js + Express 构建网站简单示例

    前言 上一篇学习了一些构建网站会用到的一些知识点:https://www.cnblogs.com/flyingeagle/p/9192936.html 这一篇主要结合前面讲到的知识,去构建一个较为完整 ...

  9. nodejs+express+mongodb实现登录注册

    nodejs+express+mongodb实现登录注册 1 简介 登录注册功能使用nodejs+express+mongodb完成,其中对mongodb的操作使用mongoose完成,对mongod ...

随机推荐

  1. 批判性思维——Asking The Right Questions

    我们生活在一个纷繁复杂的数字世界中,每天都在信息海洋中遨游.如果不想被其淹没,继而成为别人思想的傀儡,就有必要对你接受的信息进行批判.筛选,自己决定该相信什么不该相信什么,进而形成自己的观点,而不是一 ...

  2. fopen,fread和fwrite

    在最近的编程练习和写东西的过程中,常常用到了fopen和fread两个函数来读取本地文件.之前使用这两个函数时,一直没有出现过什么问题.也是因为没有出现问题,对这两个函数的用法的一些细节没有很了解,所 ...

  3. 把汉字转换为html实体编码

    背景:工作中需要把汉字转换为html实体编码实现方式:import org.apache.commons.lang.StringEscapeUtils;public static void main( ...

  4. js 复选框 全选都选 如果某一个子复选框没选中 则全选按钮不选中

    <!DOCTYPE HTML> <html> <head> <meta charset=UTF-8> <title>js 复选框 全选都选 ...

  5. 如何写出优雅的Python

    Looping over a range of numbers Bad: for i in [0,1,2,3,4,5]: print i**2 Good: for i in range(6): pri ...

  6. System.UnauthorizedAccessException Access to the path "/etc/mono/registry" is denied.

    sudo mkdir /etc/mono/registry sudo mkdir /etc/mono/registry/LocalMachine sudo chmod g+rwx /etc/mono/ ...

  7. Apache部署django项目

    在此之前,我们一直使用django的manage.py 的runserver 命令来运行django应用,但这只是我们的开发环境,当项目真正部署上线的时候这做就不可行了,必须将我们的项目部署到特定的w ...

  8. margin padding

    margin and padding有时候可以实现相同的效果但是 用padding的场合更多 2者的区别和用法的细节我还是没掌握好

  9. Good Bye 2015 D. New Year and Ancient Prophecy

    D. New Year and Ancient Prophecy time limit per test 2.5 seconds memory limit per test 512 megabytes ...

  10. Upnp资料整理

    系统,软件和路由器都要打开upnp功能. windows7下,分别启动 function discovery resources publication; Upnp device host; SSDp ...