windows学习环境:
node 版本: v0.10.35
express版本:4.10.0
mysql版本:5.6.21-log
第一部分:安装node 、Express(win8系统 需要"命令行【管理员】"执行" msiexec+/package+安装包路径 "安装,否则会安装失败)
1)、下载nodejs,官方下载地址:http://nodejs.org/
2)、安装过程,选择下一步直到安装完成。(node -v | npm-v //查看版本)
3)、打开命令行执行命令 "npm install -g express-generator" 等待安装完成就好了。(express -V//查看版本)
第二部分:
概览:
1、新建一个工程
2、在views目录下新建ejs模板网页
3、连接mysql数据库dbConnect.js
4、配置app.js 和 package.json
5、配置路由(2种方式)
6、加入session和cookies
详细内容:
NO 1. 新建工程
①、cd到要创建工程的目录: cd: NewCode\Node
②、使用express创建工程: express -e ejs testA
③、cd到testA: cd testA
④、安装node_modules: npm install(这个过程有点慢)
⑤、启动工程: npm start
⑥、打开浏览器访问:http://localhost:3000(默认端口是3000)
NO2.
在views目录下新建ejs模板: index.ejs(已有), error.ejs(已有), header.ejs, footer.ejs, home.ejs, login.ejs, reg.ejs 如下图:
代码如下:
1 2 3 4 5Test 6 7 8 910 12 17<%= title %>
11
1 2 3
1 <%- include header %> 23 2930 <%- include footer %>
1 <%- include header %> 23 2526 <%- include footer %>
1 <% include header %> 2 用户:<%= user %>欢迎登录!!
3 退出 4 <% include footer %>
1 <%- include header %> 2 <% if(locals.islogin){%> 3 用户:<%= test %>
已经登陆 4 <% }else{%> 5 6 <%}%> 7 <%- include footer %>
NO 3. 连接mysql数据库dbConnect.js
在node_modules目录下创建一个文件夹dao存放dbConnect.js,目录为: /node_modules/dao/dbConnect.js
1 var mysql=require('mysql'); 2 3 function connectServer(){ 4 5 var client=mysql.createConnection({ 6 host:'localhost', 7 user:'root', 8 password:'abc123456', 9 database:'dby' 10 }) 11 12 return client; 13 } 14 15 16 function selectFun(client,username,callback){ 17 //client为一个mysql连接对象 18 client.query('select password from table_1 where username="'+username+'"',function(err,results,fields){ 19 if(err) throw err; 20 21 callback(results); 22 }); 23 } 24 25 function insertFun(client , username , password,callback){ 26 client.query('insert into table_1 value(?,?)', [username, password], function(err,result){ 27 if( err ){ 28 console.log( "error:" + err.message); 29 return err; 30 } 31 callback(err); 32 }); 33 } 34 35 exports.connect = connectServer; 36 exports.selectFun = selectFun; 37 exports.insertFun = insertFun;
NO 4. 配置app.js , package.json
其中注明有: // 需要添加的 和 //需要修改的
1 var express = require('express'); 2 var path = require('path'); 3 var favicon = require('serve-favicon'); 4 var logger = require('morgan'); 5 var cookieParser = require('cookie-parser'); 6 var bodyParser = require('body-parser'); 7 var routes = require('./routes/index'); 8 var users = require('./routes/users'); 9 // 需要添加的 10 var session=require('express-session'); 11 12 13 14 var app = express(); 15 16 // view engine setup 17 app.set('views', path.join(__dirname, 'views')); 18 app.set('view engine', 'ejs'); 19 20 app.use(logger('dev')); 21 app.use(bodyParser.json()); 22 app.use(bodyParser.urlencoded({ extended: false })); 23 24 //需要修改的 25 app.use(cookieParser("An")); 26 //需要添加的 27 app.use(session({ 28 secret:'an', 29 resave:false, 30 saveUninitialized:true 31 })); 32 33 34 app.use(express.static(path.join(__dirname, 'public'))); 35 36 app.use('/', routes); 37 app.use('/users', users); 38 39 // catch 404 and forward to error handler 40 app.use(function(req, res, next) { 41 var err = new Error('Not Found'); 42 err.status = 404; 43 next(err); 44 }); 45 46 // error handlers 47 48 // development error handler 49 // will print stacktrace 50 if (app.get('env') === 'development') { 51 app.use(function(err, req, res, next) { 52 res.status(err.status || 500); 53 res.render('error', { 54 message: err.message, 55 error: err 56 }); 57 }); 58 } 59 60 // production error handler 61 // no stacktraces leaked to user 62 app.use(function(err, req, res, next) { 63 res.status(err.status || 500); 64 res.render('error', { 65 message: err.message, 66 error: {} 67 }); 68 }); 69 70 module.exports = app;
1 { 2 "name": "test4", 3 "version": "0.0.0", 4 "private": true, 5 "scripts": { 6 "start": "node ./bin/www" 7 }, 8 "dependencies": { 9 "express": "~4.10.6", 10 "body-parser": "~1.10.1", 11 "cookie-parser": "~1.3.3", 12 "morgan": "~1.5.1", 13 "serve-favicon": "~2.2.0", 14 "debug": "~2.1.1", 15 "ejs": "~1.0.0", 16 //需要添加的,也可以从其他地方拷贝到node_modules目录下 17 "mysql":"latest", 18 "express-session":"latest" 19 } 20 }
NO 5. 配置路由
第一种方式:全部路由规则集中写在 routes目录下的index.js文件中,代码如下:
1 var express = require('express'); 2 var router = express.Router(); 3 var usr=require('dao/dbConnect'); 4 5 /* GET home page. */ 6 router.get('/', function(req, res) { 7 if(req.cookies.islogin){ 8 req.session.islogin=req.cookies.islogin; 9 } 10 if(req.session.islogin){ 11 res.locals.islogin=req.session.islogin; 12 } 13 res.render('index', { title: 'HOME',test:res.locals.islogin}); 14 }); 15 16 17 router.route('/login') 18 .get(function(req, res) { 19 if(req.session.islogin){ 20 res.locals.islogin=req.session.islogin; 21 } 22 23 if(req.cookies.islogin){ 24 req.session.islogin=req.cookies.islogin; 25 } 26 res.render('login', { title: '用户登录' ,test:res.locals.islogin}); 27 }) 28 .post(function(req, res) { 29 client=usr.connect(); 30 result=null; 31 usr.selectFun(client,req.body.username, function (result) { 32 if(result[0]===undefined){ 33 res.send('没有该用户'); 34 }else{ 35 if(result[0].password===req.body.password){ 36 req.session.islogin=req.body.username; 37 res.locals.islogin=req.session.islogin; 38 res.cookie('islogin',res.locals.islogin,{maxAge:60000}); 39 res.redirect('/home'); 40 }else 41 { 42 res.redirect('/login'); 43 } 44 } 45 }); 46 }); 47 48 router.get('/logout', function(req, res) { 49 res.clearCookie('islogin'); 50 req.session.destroy(); 51 res.redirect('/'); 52 }); 53 54 router.get('/home', function(req, res) { 55 if(req.session.islogin){ 56 res.locals.islogin=req.session.islogin; 57 } 58 if(req.cookies.islogin){ 59 req.session.islogin=req.cookies.islogin; 60 } 61 res.render('home', { title: 'Home', user: res.locals.islogin }); 62 }); 63 64 router.route('/reg') 65 .get(function(req,res){ 66 res.render('reg',{title:'注册'}); 67 }) 68 .post(function(req,res) { 69 client = usr.connect(); 70 71 usr.insertFun(client,req.body.username ,req.body.password2, function (err) { 72 if(err) throw err; 73 res.send('注册成功'); 74 }); 75 }); 76 77 module.exports = router;
第二种方式: 每一个views目录下有的ejs文件,都在 routes目录下 建立对应的.js路由控制器,目录:
这种方式需要在app.js中指定路由路径,示例如下:
1 //需要添加的 2 var a=require('./routes/a'); 3 var b=require('./routes/b'); 4 var c=require('./routes/c'); 5 6 ... 7 var app=Express(); 8 ... 9 10 //需要添加的 11 app.use('/a',a); 12 app.use('/b',b); 13 app.use('/c',c);
NO 6.加入session 和 cookies
①、在package.json中添加mysql 和 express-session,添加内容:
package.json里面的注释不能有,需要删除
1 //需要添加的,也可以从其他地方拷贝到node_modules目录下 2 "mysql":"latest", 3 "express-session":"latest"
②、执行命令安装,必须先cd到指定的工程目录下,命令: npm install (示例如下,工程为:testA)
安装后的目录:
③、修改app.js,添加和修改代码:
1 // 需要添加的, 在[ var app = express(); ] 上方 2 var session=require('express-session'); 3 4 var app = express(); 5 6 //需要修改的 7 app.use(cookieParser("An")); 8 9 //需要添加的, 在[ var app = express(); ] 下方 10 app.use(session({ 11 secret:'an', 12 resave:false, 13 saveUninitialized:true 14 }));
④、路由控制器routes中index.js的session和cookies, router.route('/login') :
1 router.route('/login') 2 .get(function(req, res) { 3 if(req.session.islogin){ 4 res.locals.islogin=req.session.islogin; 5 } 6 7 if(req.cookies.islogin){ 8 req.session.islogin=req.cookies.islogin; 9 } 10 res.render('login', { title: '用户登录' ,test:res.locals.islogin}); 11 }) 12 .post(function(req, res) { 13 client=usr.connect(); 14 result=null; 15 usr.selectFun(client,req.body.username, function (result) { 16 if(result[0]===undefined){ 17 res.send('没有该用户'); 18 }else{ 19 if(result[0].password===req.body.password){ 20 req.session.islogin=req.body.username; 21 res.locals.islogin=req.session.islogin; 22 res.cookie('islogin',res.locals.islogin,{maxAge:60000}); 23 res.redirect('/home'); 24 }else 25 { 26 res.redirect('/login'); 27 } 28 } 29 }); 30 });
⑤、前端的session使用,views目录下的login.ejs:
1 <%- include header %> 23 2930 <%- include footer %>
⑥、对于session和cookies的经验:
session:单一的session使用在一次回话中,session会保存直到浏览器关闭。
写入session:
req.session.islogin="write";
res.locals.islogin=req.session.islogin;
使用session(前端):
<% if(locals.islogin){ %>
session为真。
<% }else{ %>
<%- include html引用 %>
<% } %>
cookie: cookie是为session服务的,cookie依赖session:
写入cookie:
res.cookie('islogin','wirteCookie',{maxAge:60000}); //毫秒为单位
使用cookie(路由控制器端):
if(req.cookies.islogin){ req.session.islogin=req.cookies.islogin; }
if(req.session.islogin){ res.locals.islogin=req.session.islogin; }
源码下载链接:http://pan.baidu.com/s/1ntkmCmH
初学Node.js,不到之处,恳请包涵。
转自: http://www.cnblogs.com/allsmy/p/4221593.html