express
express是一个基于node.js的极简、灵活的web开发框架。可以实现非常强大的web服务器功能。
express的特点
可以设置中间件响应或过滤http请求。
可以使用路由实现动态网页,响应不同的http请求。
内置支持ejs模板(默认是jade模板)实现模板渲染生成html。
使用express框架
初始化项目
npm init
安装
npm install express -save
引入
const express = require ("express");
创建服务
const app = express()
监听端口
app.listen(3000,()=>{console.log("服务器已运行")})
//引入express包
const express = require('express')
const bodyParser = require('body-parser')
const app = express()
//使用bodyParser
app.use(bodyParser.urlencoded({ extended: false }))
//设置模板引擎是ejs模板
app.set('view engine', 'ejs');
//接受post方式发送的数据
app.post('/heaven',function(req,res){
console.log('post请求过来了');
console.log(req.body)
// res.end({name:'heaven'})
//send函数是express新增的 这个方法可以发送数组和对象给前台
res.send([1,2,3])
})
//自动为public目录中的文件设置路由
app.use(express.static('public'))
app.listen(3001,()=>{
console.log('3001端口成功运行');
})
路由
1. 什么是路由?
路由是指接收用户请求,处理用户数据,返回结果给用户的一套程序。 可以理解为:动态网页的程序。
后端路由的核心: URL
2. express的路由
express对象自带有一个Router类, 可以实例化出路由对象,可以在该对象上挂载非常多的路由节点。
3. 路由的写法
//挂载路由线路的写法
router.请求方式('请求地址',function(req,res){
res.send('数据');
});
4. 路由的区分
大路由(总路由): app.js 负责接收所有请求,对请求进行分配
小路由(分路由): /routes下面的所有路由模块, 只负责处理自己能管理的目录下的所有请求
挂载路由:get方式
app.get(路由,(req,res,next)=>{
//get请求数据存放在req.query上
//对应的逻辑
})
挂载路由:post方式
app.post(路由,(req,res,next)=>{
//post请求数据可以通过安装中间件body-parser来获取,安装后数据存放在req.body上
//对应的逻辑
})
挂载路由:静态资源
//public目录下的文件 use方法get请求和post请求都会触发
app.use(express.static("public"))
创建独立的路由
创建一个独立的路由模块
//需求:创建一个vip路由模块,接收vip目录下的所有请求,响应数据。
1) 创建一个vip路由模块
在routes路由目录下创建vip.js
2) 编写路由模块的代码
a. 引入express模块
b. 实例化路由对象
c. 编写路由线路挂载到路由对象上
d. 暴露路由对象
3) 将编写好的路由模块引入到主模块,由主模块分配对应的请求到该模块去处理
var vip=require('./routes/vip.js'); //引入vip路由模块
app.use('/vip',vip); //分配 vip目录下的请求给vip路由模块去处理
vip.js
//这是vip.js
var express=require('express'); //引入express模块
var router=express.Router(); //利用Router类创建一个路由实例
//编写list.html用于展示所有的vip用户
router.get('/list.html',function(req,res){
res.send('<h1>张三、李四、王小五</h1>');
});
//注意:写请求路径时不需要加父目录名, 不要加 /vip,不需要写 路径中 vip后面的一截。
router.get('/info.html',function(req,res){
res.send('<h1>会员名:张三<br/>年龄:18<br/>特征:经常失踪</h1>');
});
module.exports=router;
主模块(app.js)
//这是主模块
var vip=require('./routes/vip.js'); //引入vip路由模块
app.use('/vip',vip); //分配 vip目录下的请求给vip路由模块去处理
使用express-generator快速搭建express框架
express-generator是 express官方团队为开发者准备的一个快速生成工具,可以非常快速的生成一个
基本的express开发框架。
安装express-generator生成器
cnpm i -g express-generator //安装完成后可以使用express命令
创建项目
express -e 项目名称 //自动创建项目目录
express -e //不会创建项目目录
安装依赖
cnpm i
开启项目
node app //【推荐】需要手动添加监听端口的代码
app.listen(80,function(){
console.log('服务器已运行...');
});
npm start //自动查找当前目录下的 package.json文件,找到 start对应的命令进行执行
node ./bin/www
测试项目
打浏览器,输入 localhost
目录说明
目录
bin 可执行文件目录
node_modules 依赖包的目录
public 静态文件根目录
所有的静态文件都应当放在这个目录下(静态html、css、js、图片、字体、视频等资源)
routes 路由模块目录,动态文件的目录
请求发生时,优先找静态文件,如果没有静态存在则找动态路由,如果动态路由也没有,就404
views 视图目录,用于存储所有的ejs模板
文件
app.js 项目的主文件,对整个项目的所有资源进行统筹的安排。
package.json 项目描述文件,声明项目的名称、版本、依赖等信息。
请求对象
请求对象 req:
1) 什么是请求对象?
客户端向服务器发送数据的对象,包含请求头和请求主体
2) 接收GET方式传的值【重点】
语法: req.query.参数名
示例: req.query.id
3) 接收POST方式传的值【重点】
语法: req.body.参数名
示例: req.body.username
(解析body不是nodejs默认提供的,需要载入body-parser中间件才可以使用req.body;
此方法通常用来解析POST请求中的数据)
4) 匹配URL网址上的数据(匹配模式)
在接请求地方去匹配,再通过语法进行接收。
语法: req.params.参数名
响应对象
响应对象 res:
1) 响应对象是什么
响应对象是指服务器向客户端响应数据的对象,包含了所有要响应的内容
2) 响应对象的方法
res.send(); //【重点】返回任意类型的数据给客户端
注意:
a. 如果返回一个数字,会当成是状态码,会报错。
b. send方法只能出现一次,重复无效还要报错。
res.json(); //返回JSON数据,自动设置响应头
res.render('模板名称',{数据}); //【重点】读取模板文件,拼接数据,自动将结果发送给浏览器
res.redirect('目标'); //服务器端跳转
res.set({"Content-Type":"text/html; charset=utf-8"}); //【重点】设置响应头
res.status(); //【重点】设置状态码
中间件
中间件:
1) 什么是中间件?
中间件就是一个函数, 位于客户端与路由之间,可以访问请求对象和响应对象,也可以调起下一个中间件。
express框架就是一个由中间件构架起来的框架,整个框架全是中间件。
2) 自定义中间件
app.use(function(req,res,next){
res.send('我是中间件');
});
3) 尾函数 next
如果在中间件不调用next函数, 整个请求响应流程就中止不会再往后面执行
调用尾函数相当于调用下一个中间件,执行完以后自己的函数继续执行