第一部分,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对象