初步使用
第一步
- npm install express
示例:server.js
- 1、创建服务
- 2、监听
- 3、处理请求
const express = require('express');
var server = express();//1、创建服务
//3、响应请求
//use() 添加响应
server.use('/a.html',function(req,res){
//req和res是经过express封装过的,并非nodejs中原生的
res.send('abc');//类似于write()
res.end();
});
server.use('/b.html',function(req,res){
res.send('cba');//类似于write()
res.end();
});
server.listen(8080);//2、监听
3种接收用户请求的方法:
- get(‘/’,function(req,res){});
- post(‘/’,function(req,res){});
- use(‘/’,function(req,res){});//都能接收get和post方式的请求
改进
express-static 处理静态文件的中间件
const express = require('express');
const expressStatic = require('express-static');
var server = express();
server.listen(8080);
//接口:get方式: /login?user=xxx&psw=xxx
//返回: {result:true/false,msg:'原因'}
server.get('/login',function(req,res){
var user = req.query['user'];
var psw = req.query['psw'];
if(users[user]==null){
res.send({reslut:false,msg:'不存在'});
}else {
if(users[user]!=pass){
res.send({reslut:false,msg:'密码错了'});
}else{
res.send({reslut:true,msg:'成功'});
}
}
});
server.use(expressStatic('./www'));//从www这个目录下读取静态文件
处理数据
const express = require('express');
const bodyParser = require('body-parser');
var server = express();
server.listen(8080);
server.use(bodyParser.urlencoded({
extended: false, //扩展模式,true启用,false普通模式
limit: 2*1024*1024 //限制,最大支持的POST数据,默认100k
})); //使用多个use()时,会形成一个链式操作(下面会讲到)
//获取Get,Post相关数据
server.use('/',function(req,res){
console.log(req.query); //获取Get
console.log(req.body);
//获取Post,需要一个中间环节server.use(bodyParser.urlencoded({}));
});
由此可见:
- Get无需中间件支持
- POST需要body-parser中间件,先server.use(bodyParser.urlencoded({})); 后req.body
链式操作
从上节中可以看到链式操作,你可以简单理解使用链式操作是规定这个操作流程有一个步骤,即需要先做什么,然后做什么。依次下去形成一个“流水线”。
改写示例:
const express = require('express');
const bodyParser = require('body-parser');
var server = express();
server.listen(8080);
server.use('/',function(req,res,next){//注意参数
console.log(1);
next(); //**注意,next()是选择性的执行**
});
server.use('/',function(req,res,next){
console.log(2);
});
注意到,在use()的参数中,多了一个next,这是一个可选操作,即供用户选择是否要下一步操作。
中间件怎么写——原生
const express = require('express');
const querystring = require('querystring');
var server = express();
server.listen(8080);
server.use(function(req,res,next){//没有第一个参数,则对所有路径请求都接收
//原生写法
var str = '';
req.on('data',function(data){
str+=data;
});
req.on('end',function(){
req.body = querystring.parse(str); //解析字符串
next(); //**注意next()所在位置**
});
});
server.use(function(req,res){
console.log(req.body);
});
改写,将其写成一个模块mybody-parser.js。
const querystring = require('querystring');
modules.exports={//没有第一个参数,则对所有路径请求都接收
parser:function(){
return function(req,res,next){
var str = '';
req.on('data',function(data){
str+=data;
});
req.on('end',function(){
req.body = querystring.parse(str); //解析字符串
next(); //注意next()所在位置
});
};
};
};
引用mybody-parser.js模块
const express = require('express');
const mybodyParser = require('mybody-parser');
//mybody-parser输出的是一个function,那么mybodyParser就是一个function
var server = express();
server.listen(8080);
server.use(mybodyParser.parser());//使用mybody-parser中间件
server.use(function(req,res){
console.log(req.body);
});
cookie && session
cookie : 在浏览器保存一些数据,每次请求都会带过来
缺陷:不安全、存储空间有限(4k)session : session是逻辑上的,其还是基于cookie实现,也保存数据,但保存在服务端。
优点:安全、存储空间依据服务器空间。
原理:客服端请求服务端,先带一个空的cookie={}传到服务端,然后服务端对这个cookie赋值并写到客户端;下一次客户端向服务端发起请求时,就会带上这个cookie。cookie中会有一个session的ID,服务器利用sesssion的ID找到session文件或读取、写入。
隐患:session劫持。
读取与发送cookie
- 读取——
cookie-parser
const express = require('express');
const cookieParser = require('cookie-parser');//引入中间件
var server = express();
//cookie
server.use(cookieParser());
server.use('/',function(req,res){
res.cookie('user','imaginecode',{path:'/www',maxAge:30*24*36000*1000});
//maxAge:设置过期时间(有效期),单位毫秒
//path:指定在该路径下可以读这个cookie
//读取cookie
console.log(req.cookies);
});
server.listen(8080);
- cookie安全性:cookie签名
const express = require('express');
const cookieParser = require('cookie-parser');//引入中间件
var server = express();
//cookie
server.use(cookieParser('imaginecode0101'));
server.use('/',function(req,res){
req.secret = 'imaginecode0101';//设置密钥
res.cookie('user','imaginecode',{signed:true});
//加入参数signed签名,需要提供密钥secret
console.log("带签名的cookie",req.signedCookies);
console.log("无签名的cookie",req.cookies);
});
server.listen(8080);
注意
cookie空间非常下,要省着用;
安全性差——校验cookie是否被纂改过;
小结
- res.cookie()//发送cookie
- 读取cookie:使用到中间件——cookieParser,
server.use(cookieParser('密钥'))
- 用cookie: req.cookies 未签名版,req.signedCookies 带签名
删除cookie: res.clearCookie(cookie名);
cookie加密——
cookie-encrypter
,cookie加密意义不大。
session——cookie-session中间件
1、写入
2、读写
const express = require('express');
const cookieParser = require('cookie-parser');//引入中间件
const cookieSession = require('cookie-session');
var server = express();
//cookie
server.use(cookieParser('imaginecode0101'));
//session
server.use(cookieSession({
name: 'sess',//session名
keys = ['aaa','bbb','ccc'],
//使用session时,需要加keys--密钥,keys为数组,会依次循环使用keys中的密钥对session加密
//keys密钥数组越长,越安全
maxAge: 1*3600*1000 //设置有效期1小时
}));
server.use('/',function(req,res){
if(req.session['count']==null){//第一次
req.session['count']=1;
}else {
req.session['count']++;
}
console.log(req.session);//注意session在request上
});
server.listen(8080);
至此,归纳了Express的基础使用。但是,要拿Express具体做些东西的话,这些还不够。下一节会对模板引擎进行归纳。