介绍
- 什么是Express
Express是一个基于node.js的极简、灵活的web开发框架。可以实现非常强大的web服务器功能。 - express的特点
可以设置中间件响应或过滤http请求
可以使用路由实现动态网页,响应不用的http请求
内置支持ejs模板(默认地jade模板)实现模板渲染生成html - express-generator生成器
express-generator是express官方团队为开发者准备的一个快速生成工具,可以非常快速的生成一个基本的express开发框架。 - express安装与使用
- 安装express-generator生成器
cnpm i -g express-generator
安装完成后使用express命令 - 创建项目
express -e 项目名称
自动创建项目目录express -e
需要手动创建项目目录 - 安装依赖
cnpm i
- 开启项目
node app
需要手动添加监听端口的代码npm start
自动查找当前目录下的package.json文件,找到start对应的命令进行执行node ./bin/www
- 测试项目
打开浏览器,输入项目地址
目录说明
- 目录
- bin:可执行文件木
- node_modules:依赖包的目录
- public:静态文件根目录。所有静态文件都应当放在这个目录下(静态html、css、js、图片、字体、视频等资源)
- routes:路由模块目录,动态文件的目录。请求发生时,优先照静态文件,如果没有静态存在则照动态路由,如果动态路由也没有,就404
- views:项目目录,用于存储所有的ejs模板
- 文件
- app.js:项目的主文件,对整个项目的所有资源进行统筹的安排
- package.json:项目描述文件,声明项目的名称、版本、依赖等信息
路由
- 什么是路由?
路由是指接收用户请求,处理用户数据,返回结果给用户的一套程序。可以理解为:动态网页的程序。
后端路由的核心:URL - express路由
express对象自带有一个Router类,可以实例化出路由对象,可以在改对象上挂载非常多的路由节点。 - 路由的写法
//挂载路由线路的写法
router.请求方式('请求地址',function(req,res){
res.send('数据')
})
- 创建一个独立的路由模块
//需求:创建一个vip路由模块,接收vip目录下的所有请求,响应数据
1)创建一个vip路由模块
2)编写路由模块的代码
a. 引入express模块
b. 实例化路由对象
c. 编写路由线路挂载到路由对象上
d.暴露路由对象
3)将编写好的路由模块引入到主模块,由主模块分配对应的请求到改模块去处理
var vip=require(’./routes/vip.js’);//引入vip路由模块
app.use(’/vip’,vip);//分配vip目录下的请求给vip路由模块去处理 - 路由的区分
大路由(主路由):app.js 负责接收所有请求,对请求进行分配
小路由(分路由):/routes下面的所有路由模块,只负责处理自己能管理的目录下的所有请求
响应对象res
- 响应对象是什么
响应对象是在服务器向客户端响应数据的对象,包含了所有要响应的内容 - 响应对象的方法
- res.send();//返回任意类型的数据费客户端
注意:
a. 如果返回一个数字,会当成是状态码,会报错
b. send方法只能出现一次,重复无效还要报错 - res.json();//返回JSON数据,自动设置响应头
- res.render(‘模板名称’,{数据});读取模板文件,拼接数据,自动将结果发送给浏览器
- res.donwload(‘文件地址’);下载当前目录下面的文件
- res.redirect(‘目标’);服务器跳转
- res.set(‘响应头对象’)//设置响应头
- res.status();//设置状态码
var express = require('express');
var router = express.Router();
router.get('/response.html', function(req, res, next) {
// res.send('hello world');//可以返回字符串
// var data=[{id:"1",name:"lili"}];
// res.send(data);
// res.send('1');//如果一定要返回数字,必须加引号变成字符串
//返回状态码+数据 链式调用
// res.status(200).send('啦啦啦啦');
//返回json,自动设置响应头
//res.json(data);
//模板渲染
// res.render('index.ejs',{title:'张三'});
});
module.exports = router;
请求对象req
- 什么是请求对象?
客户端想服务器发送的对象,包含请求头和请求主体 - 接收GET方式传的值
语法:req.query.参数名
示例: - 接收POST方式传的值
语法:req.body.参数名
- 匹配URL网址上的数据(匹配模式)
在接请求地方去匹配,再通过语法进行接收。
语法:req.params.参数名
var express = require('express');
var router = express.Router();
//编写login.html路由,接收POST传的值,处理数据
router.get('/login.html', function(req, res, next) {
var username=req.body.username;
res.send('用户名:'+username)
});
//编写news路由,接收新闻请求
router.get('/news/:id',function(req,res){
var id=req.params.id;
res.send('获取的id为:'+id)
})
module.exports = router;
中间件
- 什么是中间件?
中间件就是一个函数,位于客户端与路由之间,可以访问请求对象和响应对象,也可以调起下一个中间件。
express框架就是一个由中间件构架起来的框架,整个矿建全是中间件。 - 自定义中间件
app.use(function(req,res,next){console.log(‘我是中间件’)});
- 尾函数next
如果在中间件不调用next函数,整个请求响应过程就终止,不糊再往后执行。
调用尾函数相当于调用下一个中间件,执行完以后自己的函数继续执行。
app.use(function(req,res,next){
console.log('111');
next();
console.log('222');
})
app.use(function(req,res,next){
console.log('333');
next();
console.log('444');
})
app.use(function(req,res,next){
console.log('555');
})
//结果是111 333 555 444 222
静态文件托管
为了提供诸如图像、CSS 文件和 JavaScript 文件之类的静态文件,请使用 Express 中的 express.static
内置中间件函数。
此函数特征如下:
express.static(root, [options])
例如,通过如下代码就可以将 public 目录下的图片、CSS 文件、JavaScript 文件对外开放访问了:
app.use(express.static('public'))
现在,你就可以访问 public 目录中的所有文件了:
http://localhost:3000/images/kitten.jpg
http://localhost:3000/css/style.css
如果要使用多个静态资源目录,请多次调用 express.static 中间件函数:
app.use(express.static('public'))
app.use(express.static('files'))
访问静态资源文件时,express.static 中间件函数会根据目录的添加顺序查找所需的文件。
app.use('/static', express.static('public'))
现在,你就可以通过带有 /static 前缀地址来访问 public 目录中的文件了。
http://localhost:3000/static/images/kitten.jpg
http://localhost:3000/static/css/style.css
解决跨域
安装cors
cnpm i cors
node中使用
app.use(require('cors')());