一、什么是Express
Express就是一个为nodejs设计的web开发框架,它基于nodejs平台,本身功能极简,灵活,它提供了一系列强大的特性来帮助创建各种web和移动设备应用 。
特点:
1、可以设置 中间件来响应http请求
2、定义了路由用于执行不同的http请求动作
3、可以通过模板传递参数来动态渲染html页面
二、express的使用
1、安装
前提:在项目目录下要安装express框架(或者全局安装 -g);
win+R ——CMD(打开命令行窗口)——输入 npm install express -g;——安装完成后通过
express -V 查看express安装的版本号,注意V大写
2、使用:
在js对应的文件模块中
//引入所需的模块
var http=require('http')
var express=require('express')
//创建express对象app
var app=express();
//在app上获取请求,响应内容
app.get('/',function(req,res){ //通过get方式请求页面,'/'代表请求的是根目录(一般为首页)
res.send('欢迎访问首页'); //send()方法发送数据到客户端
res.end(); //响应结束
})
//创建服务并监听
http.createServer(app).listen(3000,function(err){
if(!err)
console.log('listening....') //当监听成功会执行
})
3、总结:
1)、express就是一个web开发框架,基于nodejs,
2)、express封装了很多nodejs的原生方法用于操作请求,响应数据等
3)、app===express();
三、express路由
3.1 路由是什么?
路由:router,是指如何定义应用 (请求的url)的端点urls以及如何响应客户端的请求,(路由实际就是url的分发,根据请求的url不同,执行不同的业务逻辑。)
作用:分发数据,根据请求的不同,分发响应不同的内容;
四、路由模块
上面的代码中直接在app里写路由,会有一个问题,当页面多了时,要判断的请求url就多了,这样使整个模块的功能就不明确了,因此可以把app.get/post这些路由抽出来,单独写成一个模块,而在app文件里,只需要引用相应的模块再作用即可,具体做法如下:
1、在项目文件夹下的router文件夹中,创建两个模块admin.js, user.js 分别对应不同页面请求的url
//1、引入express模块
var express=require('express')
var ejs=require('ejs');
var querystring=require('querystring')
//2、创建路由
var router=express.Router();
//4、添加路由,做出响应
router.get('/',function(req,res){
res.send('<h1>欢迎来到首页</h1><a href="admin/login">点击跳转到登录页面</a>')
res.end();
})
router.get('/login',function(req,res){
ejs.renderFile('../posthtml.html',function(err,data){
if(err){
console.log('读取失败')
}else{
res.send(data)
res.end();
}
})
});
//3、暴露模块接口出去
module.exports=router;
2、在app文件中使用admin模块
var http=require('http')
var express=require('express')
//引入admin模块
var admin=require('./router/admin');
//创建express对象app
var app=express();
//使用admin模块
app.use('/admin',admin); //这里的路径'/admin',使用admin模块,这个行为就是把admin模块挂载到/admin路径下,通过/admin就可以访问admin的主页,
//创建服务并监听
http.createServer(app).listen(3001,function(){
console.log('listening....')
})
3、在客户端(浏览器)查看效果
通过:127.0.0.1:3001/admin——访问到admin主页
通过:127.0.0.1:3001/admin/login——访问到admin下的子页面
在这基础之上就可以通过扩展实现返回一个html页面的功能。
五、中间件
在express中,中间件的实质就是函数,它们有一定的作用(如:增、删、改、查),起到过滤请求和响应的作用。
>中间件:Middleware,本质为一个函数,它可以访问请求对象request(res),响应对象response(res),以及在web应用上处于请求-响应循环中的中间件。
5.1 功能
1、执行任何代码
2、修改请求和响应对象
3、终结请求-响应循环
4、调用堆栈中的下一个中间件
【注意】:如果当前中间件没有结束请求-响应循环,则必须调用next()方法将控制权交给下一个中间伯,否则请求就会挂起。
5.2 中间件的分类
1、应用级中间件——自定义的中间件
var express=require('express')
var http=require('http')
var app=express();
//自定义中间件
app.use(function(req,res,next){
console.log('中间件1')
next();
});
app.use(function(req,res,next){
console.log('中间件2')
next();
});
app.get('/',function(req,res){
res.send('welcome....')
res.end();
})
http.createServer(app).listen(3002,function(){
console.log('listening....')
})
2、express内置中间件
static是express内置的唯一的中间件,它上面有很多的方法。
var options = {
dotfiles: 'ignore',
etag: false,
extensions: ['htm', 'html'],
index: false,
maxAge: '1d',
redirect: false,
setHeaders: function (res, path, stat) {
res.set('x-timestamp', Date.now());
}}
app.use(express.static('public', options));
3、第三方中间件(如:body-parser)
第三方中间件是在express的基础之上开发出来的,在使用之间要先安装相应的中间件,npm install body-parser;
【需求】:拿到用post方式提交的表单中的数据
//引入所需模块,http处理网络数据传输,express提供方法,ejs模板引擎,这里可以拿到index.html模板,body-parser:用于将req中post方式提交的数据放在req.body中
var http=require('http')
var express=require('express')
var bodyparser=require('body-parser')
var ejs=require('ejs')
//创建app
var app=express();
//使用bodyparser中间件,解析post方式提交的请求数据
app.use(bodyparser.urlencoded({extended:false}))
//当访问主页时返回的页面
app.get('/',function(req,res){
ejs.renderFile('./index.html',function(err,data){
res.send(data)
res.end();
})
})
//在index内的form表单里提交时,在后台打印req.body的值
app.post('/login',function(req,res){
console.log(req.body) //{username:'admin',pwd:'12345'}
})
//创建服务,并监听;一般放在最后,但要先写。
http.createServer(app).listen(3004,function(){
console.log('listening....')
})
六、项目中的views层
在项目中,views层一般用来存放模板的(html),router层用来放路由模块的,public层用来存放一些静态的模板(如:css,img,js等);
【需求】用res.render(‘htmlpath’)的方式来渲染一个请求的页面
var ejs=require('ejs')//用于模板引擎
var path=require('path')//用于views层的绝对路径
//2、创建app
var app=express();
//4、定义一个模板引擎
app.engine('html',ejs.__express);
//5、设置引擎的模板初始路径
app.set('views',path.join(__dirname,'views'));
//作用:设置html模板的路径为views,下面代码在使用引擎返回页面时,只需写相对views的路径即可
//6、设置对应模板引擎
app.set('views engine','html');
//3、get方式提交时,渲染页面
app.get('/',function(req,res){
//使用res.render方式发送页面
res.render('index.html')
//在这里不需要再写html相对当前文件的路径,而是直接通过views目录来找到index.html文件
})
//3、创建服务器并监听
http.createServer(app).listen(3005,function(){
console.log('listening.....')
})
【总结】:
1、app.set(‘views’,path.join(__dirname,’views’));——的作用是设置html文件模板的来源是views文件夹,当下面要发送views文件夹里的html文件到客户端时,只需要用’index.html’的方法,即不需要再写html相对于当前js文件的路径来查找要发送的html。
2、使用模板引擎的步骤:
1)、引入模板引擎require(’ejs‘)
2)、定义一个模板引擎app.engine(‘html’,ejs.__express);
3)、设置该模板引擎的模板路径(用到path.join来获取根目录到views的绝对路径)
app.set(‘views’,path.join(__dirname,’views’));
4)、设置模板引擎
app.set(‘views engine’,’html’);
5)、用新方式来发送html模板到客户端
app.get(‘/’,function(req,res){
res.render(‘index.html’)
});
5、模板引擎的作用就在于方便在发送数据时动态的去响应页面