雨终于停了,家里潮湿的很。
1. Express介绍
Express是一个简洁、灵活的node.js Web应用开发框架, 它提供一系列强大的功能,比如:模板解析、静态文件服务、中间件、路由控制等等,并且还可以使用插件或整合其他模块来帮助你创建各种 Web和移动设备应用,是目前最流行的基于Node.js的Web开发框架,并且支持Ejs、jade等多种模板,可以快速地搭建一个具有完整功能的网站。
2. 使用express
安装
npm install express
获取、引用 通过变量app
我们就可以调用express
的各种方法
var express = require('express');
var app = express();
app.listen(3000);
3. get请求
根据请求路径来处理客户端发出的GET请求 语法:
app.get(path,function(request, response));
- 第一个参数
path
为请求的路径 - 第二个参数为处理请求的回调函数,有两个参数分别是
- request 代表请求信息
- response 代表响应信息
var express = require('express'); var app = express(); app.get('/',function(req,res){ res.end('welcome to homepage'); }); app.get('/about',function(req,res){ res.end('welcome to about page'); }) app.get("*",function(req,res){ res.end("404"); }) app.listen(3000);
4. all
app.all()函数可以匹配所有的HTTP动词 语法
app.all(path,function(request, response));
示例:
var express = require('express');//引入express var app = express(); app.all("*",function(req,res){ res.send("404"); }) app.listen(3000);
5. 中间件
中间件就是处理HTTP请求的函数,用来完成各种特定的任务 比如检查用户是否登录、检测用户是否有权限访问等,它的特点是:
- 一个中间件处理完请求和响应可以把相应数据再传递给下一个中间件(一般一个路由只写一个中间件)
- 回调函数的
next
参数,表示接受其他中间件的调用,函数体中的next(),表示将请求数据传递给下一个中间件 - 还可以根据路径来区分进行返回执行不同的中间件
var express = require('express'); var app = express(); //这个是user的中间件 app.use('/user', function (req, res, next) { console.log('中间件1'); next(); }); //这个home:id的中间件 app.use('/home:id', function (req, res, next) { console.log('中间件2'); next(); }); //这个是user的路由 app.get('/user', function (req, res) { console.log('路由') res.send({name: 'Manster'}) }); app.listen(2020)
当页面请求的时候,会走后台的路由,如果我们为路由定义了一个中间件的话就会首先执行中间件,前提是中间件的代码必须写到路由的上面,且可以为一个路由定义多个中间件(但是一般情况我们只定义一个)。我们也可以定义一个没有挂载路径的中间件,那么这个中间件就是所有路由共用的中间件,应用的每个请求都会执行该中间件。 同时我们也得定义一个有三个参数的中间件作为处理错误的中间件。
错误处理中间件
错误处理中间件有 4 个参数,定义错误处理中间件时必须使用这 4 个参数。即使不需要 next
对象,也必须在签名中声明它,否则中间件会被识别为一个常规中间件,不能处理错误。
错误处理中间件和其他中间件定义类似,只是要使用 4 个参数,而不是 3 个,其签名如下: (err, req, res, next)
。
app.use(function(err, req, res, next) { console.error(err.stack); res.status(500).send('Something broke!'); });
6. 获取参数
- req.host 返回请求头里取的主机名(不包含端口号)
- req.path 返回请求的URL的路径名
app.get('/',function(req,res){ res.end('欢迎来到首页'+req.host+" "+req.path); });
7.获得查询字符串
//http://localhost:3000/?a=1&b=2&c=3 app.get('/',function(req,res){ res.send(req.query);//{a:1,b:2,c:3} });
8. params
req.params可以用来获取请求URL中的参数值
//127.0.0.1/user/12/Manster app.get('user/:id/:name',function(req,res){ res.send(req.params.id+" "+req.params.name);//{id:12,name:Manster} });
9.请求和响应
Express 应用使用回调函数的参数: request 和 response 对象来处理请求和响应的数据。
app.get('/', function (req, res) {
// --
})
request 和 response 对象的具体介绍:
Request 对象 - request 对象表示 HTTP 请求,包含了请求查询字符串,参数,内容,HTTP 头部等属性。常见属性有:
- req.app:当callback为外部文件时,用req.app访问express的实例
- req.baseUrl:获取路由当前安装的URL路径
- req.body / req.cookies:获得「请求主体」/ Cookies
- req.fresh / req.stale:判断请求是否还「新鲜」
- req.hostname / req.ip:获取主机名和IP地址
- req.originalUrl:获取原始请求URL
- req.params:获取路由的parameters
- req.path:获取请求路径
- req.protocol:获取协议类型
- req.query:获取URL的查询参数串
- req.route:获取当前匹配的路由
- req.subdomains:获取子域名
- req.accpets():检查请求的Accept头的请求类型
- req.acceptsCharsets / req.acceptsEncodings / req.acceptsLanguages
- req.get():获取指定的HTTP请求头
- req.is():判断请求头Content-Type的MIME类型
Response 对象 - response 对象表示 HTTP 响应,即在接收到请求时向客户端发送的 HTTP 响应数据。常见属性有:
- res.app:同req.app一样
- res.append():追加指定HTTP头
- res.set()在res.append()后将重置之前设置的头
- res.cookie(name,value [,option]):设置Cookie
- opition: domain / expires / httpOnly / maxAge / path / secure / signed
- res.clearCookie():清除Cookie
- res.download():传送指定路径的文件
- res.get():返回指定的HTTP头
- res.json():传送JSON响应
- res.jsonp():传送JSONP响应
- res.location():只设置响应的Location HTTP头,不设置状态码或者close response
- res.redirect():设置响应的Location HTTP头,并且设置状态码302
- res.send():传送HTTP响应
- res.sendFile(path [,options] [,fn]):传送指定路径的文件 -会自动根据文件extension设定Content-Type
- res.set():设置HTTP头,传入object可以一次设置多个头
- res.status():设置HTTP状态码
- res.type():设置Content-Type的MIME类型
10. send
send方法向浏览器发送一个响应信息,并可以智能处理不同类型的数据 并在输出响应时会自动进行一些设置,比如HEAD信息、HTTP缓存支持等等。 可以很好的替代end,end方法只能传递字符串和buffer , send方法中可以传任何东西,对象等。语法:
res.send([body|status], [body])
示例 1.当参数为一个String时,Content-Type默认设置为"text/html"。
res.send('Hello World'); //Hello World
2.当参数为Array或Object时,Express会返回一个JSON
res.send({ user: 'tobi' }); //{"user":"tobi"}
res.send([1,2,3]); //[1,2,3]
3.当参数为一个Number时,并且没有上面提到的任何一条在响应体里,Express会帮你设置一个响应体,比如:200会返回字符"OK"
res.send(200); // OK
res.send(404); // Not Found
res.send(500); // Internal Server Error
11.模板
在nodejs中使用express框架,它默认的是ejs和jade渲染模板
11.1 安装模板
npm install ejs
11.2 使用模板
使用ejs模板
//指定渲染模板文件的后缀名为ejs
app.set('view engine', 'ejs');
app.set('views',path.join(__dirname,'views'));//指定模板文件存放的路径
res.render('index'); //渲染视图 index的后缀可以省略
有时候我们使用html模板要比使用ejs模板使用的顺手,所以可以进行一下修改,模板使用html后缀
// 修改模板文件的后缀名为html app.set( 'view engine', 'html' ); app.set('views',path.join(__dirname,'views'));// 运行ejs模块 app.engine( '.html', require( 'ejs' ).__express ); //__express是ejs模块的一个公共属性,表示要渲染的文件扩展名
11.3 渲染视图
语法
- 参数
view
就是模板的文件名 - 在渲染模板时
locals
可为其模板传入变量值 callback
用来处理返回的渲染后的字符串
res.render(view, [locals], callback);
模板DEMO
var express = require('express'); var path = require('path'); var app = express(); app.set('view engine','html');//使用html模板 app.set('views',path.join(__dirname,'html'));//指定模板位置 app.engine('html',require('ejs').__express);//使用ejs来渲染html后缀的模板 var data = {title:'test',id:22,name:'Manster'};//数据 app.get('/',function(req,res){ res.render('login',data) //渲染模板,login.html的后缀可以省略 }) app.listen(3333)
11.4 模板原理
var tmpl = '<h1>{{name}}</h1><h1>{{age}}</h1>'; var data = {name:'zfpx',age:30}; var html= tmpl.replace(/\{\{(\w+)\}\}/g,function(input,group){ return data[group]; }) console.log(html);
12. 静态文件服务器
如果要在网页中加载静态文件(css、js、img),就需要另外指定一个存放静态文件的目录,当浏览器发出非HTML文件请求时,服务器端就会到这个目录下去寻找相关文件,这个每一个项目都会用到。 语法:
app.use(express.static(path.join(__dirname,'/')));
express.static 会将路径进行重定向,所以在模板文件中调用外联css或者js的时候,url地址写法要注意。所有文件的路径都是相对于存放目录的,因此,存放静态文件的目录名不会出现在 URL 中。 举例说明
每一个资源文件制定详细的文件夹,最好是将静态文件和动态文件分不同的文件夹放置,设置了express.static之后会将其指定的路径下的文件都认为是静态文件。
var express = require('express'); var app = express(); var path = require('path') app.set('view engine','html'); app.set('views',__dirname); app.engine('html',require('ejs').__express); //在这里我将静态文件的目录指定为根目录下的各个文件夹 app.use(express.static(path.join(__dirname,'css'))); app.use(express.static(path.join(__dirname,'js'))); app.use(express.static(path.join(__dirname,'img'))); var data = {title:'静态',name:'Manster'}; app.get('/',function(req,res){ res.render('index',data); }); app.listen(9969,function(){ console.log('success') }); html文件 <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title><%=title%></title> <!--这里的url地址是根据express.static的路径来写的--> <link rel="stylesheet" href="index.css"> </head> <body> <div>这是动态的数据:<%=name%></div> <p id="opp">这里是标题,红色的,有框绿色的,点击会弹出一个alert</p> <img src="280018.jpg" alt="img" title="img"> </body> <script type="text/javascript" src="alert.js"></script> </html>
13. 重定向
redirect方法允许网址的重定向,跳转到指定的url并且可以指定status,默认为302方式,因为有的时候我们比如说登录成功之后跳转到用户页面的时候,使用重定向自动跳转, 语法
res.redirect([status], url);
示例:
res.redirect("http://www.baidu.com");
14. post请求
post方法 根据请求路径来处理客户端发出的Post请求 语法:
app.post(path,function(req, res));
示例:
//这里使用了body-parser模块,它可以将post请求中的请求主体中的信息解析成对象 //放到req.body中。 var bodyParser = require('body-parser');//重要模块 app.use(bodyParser.urlencoded({extended:true}));//解析 app.post('/login',function(req,res){ console.log(req.body.username); });
文章评论