第一部分,express基础
1,express入门
node.js项目中安装express
npm install express
1.1 配置express设置
express可以使用set(setting,value),enable(setting)和disable(setting)方法来配置
下面是可以配置的变量:
env, trust proxy ,jsonp callback name, json replacer,json spaces, case sensitive routing,strict routing, view cache,view engine, views,
1.2 启动express服务器
var express = require('express'); var app = express(); app.listen(80);
2,配置路由
2.1 实现路由
语法:
app.<method>(path,[callback...],callback)
例子:
app.get('/',function(req,res){ res.send("Server Root"); }); app.post('/',function(req,res){ res.send("Save Page"); });
2.2 在路由中应用参数
使用查询字符串,使用POST参数 使用正则表达式 使用定义的参数,
使用查询字符串:
var express = require("express"); var url = require('url'); var app = express(); app.get('/find',function(req,res){ var url_parts = url.parse(req.url,true); var query = url_parse(req.url,true); res.send('Finding Book:Author:' + query.author + 'Title: ' + query.title); });
使用正则表达式应用路由参数
app.get(/^\/book\/(\w+)\:(\w+)?$/.function(req,res){ res.send('Get Book:Chapter: ' + req.params[0] + 'Page: ' +req.params[1]); });
使用已定义的参数来应用路由参数
app.get('/user/:userid',function(req,res){ res.send("Get User: " + req.param("userid")); });
为已定义的参数应用回调函数
app.apram('userid',function(req,res,next,value){ console.log("Request with userid: " + value); next(); });
3,使用Request对象
HTTPRequest对象的属性和方法如下:
originalUrl,protocol,ip,path,host,method,query,fresh,stale,secure,acceptsCharset(charset),get(header),headers。
4,使用Response对象
4.1 设置标头
相关方法如下:
get(header),set(header,value),set(headerObj),location(path),type(type_string),attachment([filepath])
4.2 设置状态
res.status(xxx);
4.3 发送响应
res.send(status,[body])
res.send([body])
4.4 发送JSON响应
res.json(status,[object])
res.json([body])
res.jsonp(status,[object])
res.jsonp([object])
4.5 发送文件
res.sendfile('arch.jpg', {maxAge:1,//24*60*60*1000, root:'./views/'}, );
4.6 发送下载响应
res.download(path,[filename],[callback])
4.7 重定向响应
res.redirect('/重定向地址')
5,实现一个模板引擎
var app = express(); app.set('views','./views'); app.set('view engine','jade') app.engine('ejs',require('ejs').__express); app.engine('html',require('ejs').renderFile);
第二部分 express应用
1,了解中间件
express支持的中间件组件如下:
- static:允许express服务器以流式处理静态文件的GET请求。这个中间件是Express内置的,它可以通过express.static()访问。
- express-logger:实现一个格式化的请求记录器来跟踪对服务器的请求
- basic-auth-connect:提供对基本的HTTP身份验证的支持。
- cookie-parser:你可以从请求读取cookie并在响应中设置cookie
- cookie-session:提供基于cookie的会话支持
- express-session:提供了一个相当强大的会话实现
- body-parser:把POST请求正文中的JSON数据解析为req.body属性
- compression:对发给客户端的大响应提供Gzip压缩支持
- csurf:提供跨站点请求伪造保护。
1.1 在全局范围内把中间件分配给某个路径
app.use('/',bodyParser());
1.2 把中间件分配到单个路由
app.get('./otherRoute',bodyParser(),function(req,res){ res.send('This request was not logged.'); });
1.3 添加多个中间件函数
var express = require("express"); var bodyParser = require('body-parser'); var cookieParser = require('cookie-parser'); var session = require('express-session'); var app = express(); app.use('/',bodyParser()); app.use('/',cookieParser()); app.use('/',session());
2,使用query中间件
var express = require('express'); var app = express(); app.get('/',function(req,res){ var id = req.query.id; var score = req.query.score; console.log(JSON.stringify(req.query)); res.send("done"); });
3,提供静态文件服务
语法
express.static(path,[options]);
path参数指定路径,options中的可选项又 maxAge hidden redirect index
4,处理POST正文数据
app.post('/',function(req,res){ });
5,发送和接收cookie
cookie-parser中间件语法:
express.cookie-parser([secret])
在响应中设置cookie:
res.cookie(name,value,[options])
options中的属性: maxAge httpOnly signed path
代码例子
var express = require("express"); var cookieParser = require('cookie-parser'); var app = express(); app.use(cookieParser()); app.get('/',function(req,res){ console.log(req.cookies); if(!req.cookies.hasVisited){ res.cookie('hasVisited','1', {maxAge:60*60*1000, httpOnly:true, path:'/'}); } res.send("Sending Cookie"); }); app.listen(80);
6,实现会话
使用cookie-session 注意cookie-session在底层利用cookie-parser中间件,所以你需要先添加cookie-parser中间件
语法: res.cookie([options])
options参数可以设置的属性: key secret cookie proxy
7,应用基本的HTTP身份验证
为网站在全局范围内实现基本的HTTP身份验证
var express = require('express'); var basicAuth = require('basic-auth-connect'); var app = express(); app.listen(80); app.use(basicAuth(function(user,pass){ return(user === 'testuser' && pass === 'test'); }));
为一个单独的路由实现基本的HTTP身份验证
var express = require('express'); var basicAuth = require('basic-auth-connect'); var app = express(); app.listen(80); var auth = basicAuth(function(user,pass){ return(user === 'testuser' && pass === 'test'); }); app.get('/restricted',auth,function(req,res){ res.send('Welcome to the restricted section.'); });
8 实现会话身份验证
基本HTTP身份验证的一个主要缺点是,只要整数被存储,登录就一直存在,这不是很安全。一个更好的方法是,实现自己的身份验证机制,并将其存储在一个你可以随时使之过期的会话中。
express内的session中间件对于实现会话的验证效果都非常好。session中间件附加了一个Session对象req.session到Request对象来提供会话功能。req.session对象上有如下所示的方法
- regenerate([callback]):移除并创建一个新的req.session对象,让你重置会话
- destroy([callback]):移除req.session对象
- save([callback]):保存会话数据
- touch([callback]):为会话cookie重置maxAge计数
- cookie:指定把会话链接到浏览器的cookie对象