在原生node中若是路由和业务代码过多,代码会愈来愈复杂,难以阅读和维护,耦合的代码太多会致使修改时可能引入新的bug,咱们可使用express来解决这些问题。Express是一个能够在node.js中使用MVC框架。css
一、本地安装:npm install express
二、引用express之后能够获得一个函数,调用此函数使用各类方法html
let express=require('express');//express是一个函数,执行后返回一个监听函数。node不支持import,只能使用commonjs。 let app=express(); app.listen(8080);//监听端口
app.listen=function(){ let server=require('http').createServer(this); return server.listen(...arguments); //server.apply(server,arguments) }
路由是根据客户端的不一样的请求返回不一样的响应,经过请求方法和路径执行对应的监听函数。能够定义多个路由,匹配的时候从上一次往下一次匹配,若是匹配方法名和路径都匹配上,则执行对应的监听函数并结束响应,若是有任何一个没有匹配上,则往下继续匹配,若是都没有匹配上,则报错,页面显示
CANNOT+HTTP方法+路径名
建立一个路由:监听函数.方法(路径名,执行对应的函数)
```
方法有get,post,put,delete,options;options试探性,通常在post以前先发一个。
options请求方法主要有两个用途:
一、获取服务器支持的HTTP请求方法
二、用来检查服务器的性能。AJAX进行跨域请求时的预检,须要向另一个域名的资源发送一个HTTP OPTIONS请求头,用以判断实际发送的请求是否安全。前端
一、指定请求头:
curl -H 'content-type:application/json;charset=utf-8' http://localhost:8080/users
二、指定方法名
curl -X POST http://localhost:8080;在命令窗口执行的到请求的方法
三、指定请求体
curl --data "name=zfpx&age=8" http://localhost:8080/usersnode
```express
all能够匹配全部方法,*能够匹配全部路径npm
app.all('*',function(req,res){ res.end('404'); }) all表明全部匹配的方法,通常用来匹配404页面,放到全部路由的最下面,不然会截断。
* req.host 返回请求头里取得主机名(不包含端口号) * req.path 至关于pathname,express提供的,获取路径 * req.query 至关于query,express提供的,获取请求的方法 * req.method 方法,node自带的,获取查询的字符串 * req.headers 请求体,node自带的,header取值时key都是小写的,获取请求头 * req.params 能够用来获取请求URL中的参数值
express路径支持正则写法json
app.get(/\/article\/\d+/,function(req,res){ //获取当前请求的路径 req.path let id=/\/article/\(\d+)/.exec(req.path)[1]; res.end(`这是第${id}篇文章`) }) 上述方法也能够借助req.params获取路径参数。 app.get('/article/:id/',function(req,res){ res.end(`第${req.params.id}文章详情`); }); /article/1 /article/:aid=>params{aid:1} /article/1/name/2 /article/:aid/name/:age=> params{aid:1,age:2} 这其中:aid至关于表明一个位置占位符,表示必须有,可是能够是随机的
中间件是一个处理函数,它是在路由匹配之间执行的,每一个app.use表示一个中间件,它的特色是:跨域
一、中间件在路由的最上面执行,先执行中间件,再执行路由
二、能够写路径,还能够不写路径,不写默认是'/'
三、能够扩展属性和方法,相似req.path,req.query将属性和方法放在req或者res上。
四、能够用next函数,决定是否向下执行,若是调用next则能够向下执行。
五、作权限判断
六、从中间件到路由的过程函数中的req和res是同一个,并且中间件能够写多个。
七、next中若是传递参数,就会执行错误中间件,错误中间件通常放在最后
主要功能就是扩展属性和方法,放置公共逻辑,权限判断
函数的length属性能够获取函数参数的个数浏览器
let http=require('http'); function app(req,res){ let index=0; function next(){ let fn=app.routes[index++]; fn(req,res,next); } next(); } app.routes=[]; app.use=function(fn){ app.routes.push(fn); } app.use(function(req,res,next){ console.log(1); next() }) app.use(function(req,res,next){ console.log(2); }) http.createServer(app);
错误中间件 app.use((err,req,res,next)=>{ console.log(err); res.end('权限出错') });
一、实现划分路由模块,引用用户模块缓存
app.use('/user',require('./user')); 前面的是访问的路径,后面的是引用的文件的路径,后面的require('./user')应该是一个函数 app.all("*",function(req,res){ res.send('404'); })
二、导出用户模块
var express = require('express'); var router = express.Router(); router.get('/signin',function(req,res){//此时的路径至关于子路径,而且里面任然能够写小中间件。 res.end('登陆'); }); module.exports = router;
send方法向浏览器发送一个响应信息,并能够智能处理不一样类型的数据,并在输出响应时会自动进行一些设置,好比HEAD信息,HTTP缓存支持等等。 一、当参数为一个String时或者Buffer,ContentType默认设置为"text/html" 二、当参数为Array或Object时,Express会返回一个JSON 三、当参数为一个Number时,而且没有上面提到的任何一条在响应体里,Express会帮你设置一个响应体,好比:200会返回字符"OK"。
1.能够发送json
2.能够自动处理编码格式和类型
3.会自动将数字转化成对用statusText
app.use(function (req,res,next) { res.send = function (data) { if(typeof data=='string'|| Buffer.isBuffer(data)){ res.setHeader('content‐type','text/html;charset=utf8') res.end(data); }else if(typeof data=='object'){ res.setHeader('content‐type','application/json;charset=utf8'); res.end(JSON.stringify(data)); }else if(typeof data=='number'){ res.statusCode=data; res.end(require('_http_server').STATUS_CODES[data]); } }; next(); });
若是要在网页中加载静态文件(css、js、img),就须要另外指定一个存放静态文件的目录,当浏览器发出非HTML文件请求时,服务器端就会到这个目录下去寻找相关文件。
提供静态文件服务器,若是没有找到,则向下执行 let path=require('path'); app.use(express.static(path.resolve(__dirname,'views')))//views下的全部文件都是静态文件
实现static服务 let path=require('path'); let fs=require('fs'); let static=(url)=>(req,res,next)=>{ //若是当前的URL和req.path拼接,若是这个文件存在读取这个文件,返回这个文件 //若是文件不存在,调用next(); let pathname=path.join(url,req.path); fs.existsSync(pathname,function(flag){ if(flag){ fs.readFile(pathname,function(err,data){ res.end(data); }) }else{ next(); } }) }
跳转路径,重定向到指定的url地址。redirect方法容许网址的重定向,跳转到指定的url而且能够指定status,默认为302方式。 res.redirect([status],url);
分别解析json类型和表单类型数据
接收的数据:
一、"{name:1,age:2}"json格式
二、"name=1&age=2" formData,经过from表单传递的数据
//body-parser第三方express插件,至关于中间件 let bodyParser=require('body-parser'); app.use(bodyParser.urlencoded({extended:true}));若是前端传过来的是formData格式会用此中间件来解析 app.use(bodyParser.json());//若是前端传递过来的是json数据会执行此中间件来解析 app.post('/signup',function(req,res){ res.send(req.body);//传递过来的数据解析后,放在req.body这个属性上 });