express
1.创建方式
- (1)导入express模块
var express=require('express');
- (2) 调用方法,返回app
var app=express();
- (3)端口监听 最后执行
app.listen(55555);//异步
- 2.定义方式
- 根据不同的客户端请求,返回不同的响应
3.app上的方法(app本质:请求监听函数)
get
app.get('/',function (req, res) {//客户端通过get方发访问路由上的时候,会交由对应的回调函数处理 res.end('首页') });
- head
- delete
- post
- put
- app.all(‘*’)匹配所有的方法名 匹配所有路径
app.all('*',function (req, res) { res.end('此页面不存在') });
4.详细信息的获取
原理:
var urlObj=require(‘url’).parse(req.url,true);
req.path=urlObj.path;
req.query=urlObj.query;- req.method 请求方法
- req.url 请求URL
- req.path 请求路径// pathname /food
- req.header 请求头对象
- req.query 获取查询字符串
req.params 获取请求URL中的参数值
var express=require('express'); var app=express(); app.get('/users/:id',function (req, res) { var values=res.headers.host.split(':'); console.log(values[0]); console.log(values[1]||80); console.log(res.headers.host); res.end('ok'); }); app.listen('8787',function () { console.log('8787'); });
5.中间件
- 中间件都是函数,都需要调用,是为了传参(需要参数的原因:灵活传参 不用固定)
- (1.)使用
var express=require('express'); var app=express(); app.use(function (req,res) {}); app.listen(3200);
- (2)参数
- 参数1:req
- 参数2:res
- 参数3:next -》函数 调用表示继续向下执行
- (3)特点
- 一般放在路由之前
- 可能有异步代码
解决方式 通过setTimeOut(function(){ next() //等异步执行完执行next() })
- (4)作用
- 添加公共处理器
- 给请求或响应对象上增加公有的方法和属性 req.path
- (5)乱码处理
app.use(function (req,res,next) { res.setHeader('content-type','text/plain;charset=utf8');//dbf 是乱码 setTimeout(function () { next(); }); });
6.路由中间件
- 根据不同请求实现不同的功能
- 根据不同的路径请求开头分别交由各自所属范围进行执行
- 引用 创建 执行 发送
user.js var express=require('express'); var router=express.Router(); router.get('/signup',function(req,res){}) module.exports=router 路由中间件部分 var express=require('express'); var app=express(); var user=require('./router/user'); var article=require('./router/article'); /*用户 /user/sginup */ /*当请求的URL路径是以user开头的话,会交由 */ app.use('/user',user); app.use('/article',article); app.listen(7979);
7.send( )
- 特点:对传入的数据没有格式限制
- 当参数为一个String时,ContentType默认设置为”text/html”
- 当参数为Array或Object时,Express会返回一个JSON
- 当参数为一个Number时,并且没有上面提到的任何一条在响应体里,Express会帮你
设置一个响应体,比如:200会返回字符”OK”
- 特点:对传入的数据没有格式限制
8.static(静态文件中间件)
- 参数 :静态文件根目录
- 查找执行方式
- (1)在根目录下查找,找到则返回
直接从public文件之下开始查找,会返回一个函数 方式一: app.use(express.static(path.join(__dirname,'public'))); 方式二:(1)app.use(express.static(path.resolve('public'))); //-》不写/user,是全部都可以 (2)app.use('/user',express.static(path.resolve('public'))); //-》只有满足/user前缀才可以匹配
- 根目录下找不到 next向下执行
代码原理: function static(root) { //返回一个中间件函数 return function (req, res, next) { //静态文件根目录+客户端请求路径 var filename=path.join(root,req.path); fs.exists(filename,function (exist) { if(exist){ res.sendFile(filename);//发送文件给客户端 }else{ next(); } }) } }
9.tmpl(模板)
- 安装 npm install ejs
- A.特点
- (1)设置模板引擎相当于设置变量,通过app.get获取 <%= %>相当于把值放进去
- (2)MVC架构中,模板引擎包含在服务器端
B.模板渲染赋值的方式
- 真正进行模板渲染时,会将所有内容拷贝则res.locals上,然后利用res.locals进行真正的渲染
方式一: res.render('user',{users:users,title:'name'}) 方式二:res.locals.title='name'
- 真正进行模板渲染时,会将所有内容拷贝则res.locals上,然后利用res.locals进行真正的渲染
C.详细解读
- 1.参数:
参数1:views 模板相对路径(相当于模板存放的根目录)
参数2:数据对象(对象中的属性可以作为模板中的JS变量)- 1.参数:
- 2.使用ejs模板
// 指定渲染模板文件的后缀名为ejs app.set('view engine','ejs'); app.set('views',path.join(__dirname,'view')); res.render('index'); 修改模板文件的后缀名未HTML app.set('view engine','html'); //运行ejs模板app.set('views',path.join(__dirname,'views')); res.render('index');
D.模板引擎
设置模板存放根目录(views是固定不变的)
app.set('views',path.resolve('xx'));
(1)引用user.ejs文件进行模板渲染
app.set('view engine','ejs');//ejs-》指定的文件扩展名
- (2)引用HTML,以ejs进行渲染
app.engine('html',require('ejs').__express);//模板后缀是HTML的话用ejs的渲染方法进行渲染
注意点
ejs<%%>中的内容,必须要在tmpl.js中存在
html中: <title><%= title %></title> js中: res.render('user',{users,title:'name'})
10.body-parser中间件
- 用于解析客户端请求的body中的内容,内部使用JSON编码处理,URL编码处理及对于wenjian
获取请求体字符串转化城对象赋给req.body
true:querystring false :qs app.use(bodyParser.urlencoded({extended:true}));
- 11.页面跳转
- res.redirect(‘路径’)
- location
** 要传参 res.setHeader('Location','/signin');
NODE (cookie)