前言
node.js,一个基本javascript运行环境的服务器语言,它的出现使用得javascript有能力去实现服务器操作。基于node.js的Express则把原先的许多操作的变简单灵活,一系列强大特性帮助你创建各种Web应用,和丰富的HTTP工具,使用Express可以快速地搭建一个完整功能的网站。
express官方网址: www.expressjs.com.cn
Express的安装方式
Express的安装可直接使用npm包管理器上的项目,在安装npm之前可先安装淘宝镜像:
npm install -g cnpm --registry=https://registry.npm.taobap.org
cnpm install express -g//全局安装
这样我们使用cnpm的来代替npm,这使得下载速度提高很多;其次你需要在你项目目录下运行一下指令来初始化npm,期间所有提示按enter键即可,这会生成package.json,它是用于描述项目文件的。
cnpm init
再输入
cnpm install
这个项目目录中又会多出一个叫node_modules文件夹,里面是node.js为我们提供的模块,当然现在没有。接下来便是真正的安装express了,执行:
cnpm install express --save
这时,我们看到node_modules文件夹多了许多不同版本的应用文件夹,接下来执行
express --version
查看express是否安装成功
Express脚本的安装
1.安装Express脚手架有两种方式:
使用命令进行项目目录,依次执行:
cnpm i express-generator
cnpm install express-generator -g 全局安装
可通过express -h查看命令行的指令含义
express -h
第一个Express应用“Hello Wrold”
在这里,我们不使用npm构建的脚手架,而是向最开始那样直接在主目录中新建一个app.js文件在app.js中输入
const express =require('express') //引入express模块
var app = express(); //express()是express模板顶级函数
app.get('/',function(req,res){ //访问根路径时输出hello world
res.send('<h1 style='color:blue'>hello world <h1>')
});
app.listen(8080); //设置访问端口号
命令行进入项目文件夹后,键入 node app.js
使用ejs模板引擎
创建了一个名为myapp的 Express应用,并使用ejs模板引擎
express --view=ejs app
进入app,并安装依赖
cd myapp
npm install
Express路由
一、Express路由介绍
路由表示应用出现端点(URL)的定义以及响应客服端请求的方式。它包含一个请求方时(methods)、路径(path)和路由匹配时的函数(callback);
app.methods(path,callback);
二、Express路由方法
Express方法源于HTTP方法之一,附加到express类的实例,它可请求的方法包括: get、post、put、head、delete、options、trace、copy、lock、mkcol、move、purge、propfind、proppatch、unlock、report、mkactivity、checkout、merge、m-search、notify、subscribr、unsubscribe、patch、search、connect。
三、路径
Express路径包含三种表达形式,分别为字符串、字符串模式、正则表达式、
1.字符串路径
app.get("/login",function(req,res){
res.send("heng...women");
})
此路径地址将与/login匹配
2.字符串模式路径
此路由路径将与acd和相匹配abcd.
app.get('/ab?cd',function(req,res){
res.send('ab?cd')
})
这条路线的路径将会匹配abcd,abbcd,abbbcd,等等。
app.get('/ab+cd',function(req,res){
res.send('ab+cd')
})
这条路线的路径将会匹配abcd,abxcd,abRanddom,ab123cd,等。
app.get('/ab*cd',function(req,res){
res.send('ab*cd')
})
此路由器路径将与/abe和相匹配/abcde。
app.get('/ab(cd)?e',function(req,res){
res.send('ab(cd)?e')
})
3.正则表达式路径
此路由路径将匹配其中带有“a”的任何内容。
app.get(/a/,function(req,res){
res.send('/a')
})
这条路线的路径将匹配butterfly和dragonfly,但步butterflyman,dragonflyman等。
app.get(/.*fly$/,function(req,res){
res.send('/.*fly$')
} )
3.动态路由
pp.get('/news/:cataoryid/a:newsid/',(req,res)=>{
res.send("新闻id页面:\n"+req.params.newsid+"分类ID:"+req.params.cataoryid)
})

路线处理程序
您可以提供行为类似于中间件的多个回调函数来处理请求,唯一的例外是这些回调可能会调用next('route')以绕过其余的路由回调。您可以使用此机制在路由上施加先决条件,然后在没有理由继续使用当前路由的情况下将控制权传递给后续路由。
单个回调函数可以处理路由,例如:
app.get('/example/a',function(req,res){
res.end('Hello from Ai')
})
多个回调函数可以处理一条路由(确保指定了next对象),例如:
app.get('/example/b',function(req,res,next){
console.log("the")
next()
},function(req,res){
res.send("hello from B!")
})
回调函数组可以处理理由,例如:
var cb0 = function(req,res,next){
console.log('cb0')
next()
}
var cb1 =function(req,res,next){
console.log('cb1')
next()
}
var cb2 =function(req,res,next){
res.send('hello from c1')
}
app.get("/example/c",[cb0,cb1,cb2])
应对方法
res下表中响应对象()上的方法可以发送到客户端,并终止请求-响应周期。如果从路由器处理程序中未调用这些方法,则客户端请求将被挂起
方法:
res.download() 提示要下载的文件
res.end() 结束响应过程
res.json() 发送JSON响应
res.jsonp() 发送带有JSONP支持的JSON响应
res.redirect() 重定向请求
res.render() 渲染视图模板
res.send() 发送各种类型的响应
res.sendFile() 将文件作为八位字节流发送
res.sendStatus() 设置响应状态代码,并将其字符串表示形式发送为响应正文
关于POST 关于GET 请求
post方法作为http请求很重要的一部分,几乎所有的网站都有用到它,与get不同,post请求更像是在服务器上做修改操作,一般用在数据资源的更新。
相比get请求,post所请求的数据会更加安全,上一章中我们发现get请求会在地址栏显示输入的用户和密码(有中文时会转化为BASE64加密),而post请求则会将数据放入http包的包体中,这使得别人无法直接看到用户名和密码
Express如何设置POST请求
1.我们知道,首先我们得知道在form表单进行post请求,enctype属性一般设置为“application/x-www-form-urlencoded”,如果设置成multipart/form-data,则多用于文件上传,如果:
中间件
从字面意思,我们可以了解到它大概就是做中间代理操作,事实也是如此;大多数情况下,中间件就是在做接收到请求和发送响应中间得一系列操作。事实上,express是一个路由和中间件得web框架,Express应用程序基本上是一系列中间件函数得调用。
1.游览器发送请求
2.express接受请求
中间处理得过程
3.路由函数处理渲染
4.res.render渲染
中间件函数可以执行以下任务:
- 执行任何代码。
- 对请求和响应对象进行更改。
- 结束请求/响应循环。
- 调用堆栈中得下一个中间件函数。 中间件也分为应用层中间件、路由中间件、内置中间件、错误处理中间件和第三方中间件。下面分别对以下进行说明:
1.应用层中间件
应用级中间键绑定到app对象使用app.use和app.METHOD()需要处理http请求得方法,例如GET、PUT、POST,将之前的get或者post替换为use就行。
例如下面实例:
const express = require("express");
var app = express();
//匹配路由之前的操作
app.use(function(req,res,next()){
console.log("访问之前");\
//next()
});
app.get("/",function(req,res){
res.send("主页");
});
app.listen(8080);
当然也可以简化写法:
const express = require("express");
var app express();
app.use(function(req,res,next){
console.log("访问之前");
next();
},function(req,res){
res.send("主页")
})
app.listen(8080);
这时我们会发现http://localhost:8080/地址一直在加载,但命令行里显示“访问之前”,说明程序外不会同步执行,如果使用next来是路由器继续向下匹配,那么就能又得到主页数据了:
2.路由中间件
路由级中间件和应用级中间件类似,只不过他需要绑定express.Router();
var router = express.Router()
在匹配路由时,我们使用router.use()或router.VERB(),路由中间件结合多次callback可用于用户登录及用户状态检测。
const express = require("express");
var app = express();
var router = express.Router();
router.use("/",function(req,res,next){
console.log(“匹配前”);
next();
});
router.use("/user",function(req,res,next){
console.log("匹配地址:",req.originalUrl);
next();
},function(req,res){
res.send("用户登录")
});
app.use("/",router);
app.listen(8080);
3.错误处理中间件
顾名思义,它是指当我们匹配不到路由时所执行的操作。错误处理中间件和其他中间件基本一样,只不过其需要开发者提供4个自变量参数。
app.use((err,req,res,next)=>{
res.sendStatus(err.httpStatusCode).json(err);
})
一般情况下,我们把错误处理放在最下面,这样我们即可对错误进行集中处理。
const express = require("express");
var app=express();
app.get("/",function(req,res,next(){
const err = new Error('Not Found');
res.send("主页");
next(err);
});
app.use("/user",function(err,req,res,next){
console.log("用户登录");
next(err);
},function(req,res,next){
res.send('用户登录')
next();
})
app.use(function(req,res){
res.status(404).send("未找到指定页面")
});
app.listen(8080);
一、关于session
session是另一种记录客户状态的机制,与cookie保存在客服端游览器不同,session保存在服务器当中,当客户端访问服务器时,服务器会生成一个session对象,对象中保存的是key:value值,同时服务器会将key传回给客户端的cookie当中;当用户第二次访问服务器时,就会把cookie当中的key传回到服务器中,最后服务器会把value值返回给客户端。因此上面的key则时全局唯一的标识,客户端和服务端依靠这个全局唯一的标识来访问会话信息数据
设置session
我们使用express-session模块来设置session
1.安装express-session
cnpm install express-session --save
2.引用express-session模块
const session=require("express-session");
3.设置session
session(options);
如下代码:
const express = require("express");
const session =require("express-session");
var app =express();
//配置中间件
app.use(session({
secret:"keyboard cat" //加密可以写随机值
resave:true //是否强制保存
saveUninitialized ///是否保存初始化的session
cookie:('name','value',{maxAge:5*60*1000,secure:false})//设置值 和有效期
}));
app.use('/login',function(req,res){
//设置session
req.session.userinfo="张三";
res.send("登录成功");
})
app.use('/',function(req,res){
//获取session
if(req.session.userinfo){
res.send("hello"+req.session.userinfo+".welcome");
}else{
res.send("未登录")
}
});
session的常用方法
//session
req.session.username="张三"
//获取session
req.session.username
//重新设置cookie的过期时间
req.session.cookie.maxAge =1000;
//销毁session
req.session.destory(function(err){
})