express是node的一个框架,我们可以基于express快速搭建一个web服务,并且提供一些供客户端调用的api接口(支持中间件、支持路由处理等);还有一个框架和它类似,叫做koa;
学习Express:
http://www.expressjs.com.cn/4x/api.html
安装Express
如果当前电脑已经安装了yarn,我们可以基于yarn安装express及相关配套插件
yarn init -y 生成package.json文件 /* * express:express核心框架 * body-parser:用来快速解析请求主体中内容的 * express-session / cookie-parser:方便我们在express中操作session的 */ yarn add express body-parser express-session cookie-parser
创建服务,监听端口
基于NODE内置模块,使用原生JS代码实现WEB服务
let http = require('http'), fs = require('fs'), url = require('url'); http.createServer((req, res)=> { let {url:reqURL, method, headers}=req, {pathname, query}=url.parse(reqURL, true); if (pathname === '/getMatchList' && method=='GET') { } if(pathname==='/reg' && method=='POST'){ } }).listen(8888, ()=> { console.log(`server is success~`); });
基于express框架完成
express就是把我们自己用原生写的封装好了,我们以后直接调取使用即可(方便开发,有点类似于JQ)
let express = require('express'), app = express(); app.listen(8888, ()=> { console.log(`server is success~`); }); app.get(`/getMatchList`, (req, res)=> { //=>等价于原生 //req.url 请求的地址+问号传参 //req.method 请求的方式(大写) //req.headers 请求头(小写) //=>EXPRESS新提供的 //req.path 相当于我们原生中通过URL内置模块的PARSE方法解析出来的PATH-NAME //req.query 相当于解析出来的QUERY //=>等价于原生 //res.writeHead 重写响应头 //res.write 响应主体 //res.end 结束响应(响应主体) /* res.writeHead(200, { 'content-type': 'application/json' }); res.end(JSON.stringify({"id": 1, "name": "珠峰培训 "}));//=>只能返回字符串或者Buffer格式数据 //--------- fs.readFile('./index.html',(err,data)=>{ if(err) return; res.writeHead(200,{ 'content-type':'text/html' }); res.end(data); }); //=>好麻烦 */ //=>EXPRESS独有的 //res.sendFile('./index.html',{root:__dirname}); 读取指定的文件,并且把内容响应给客户端 //res.json({"id":1,"name":"珠峰"}); 我们可以直接放JSON,EXPRESS帮我们把它转换为字符串返回给客户端(并且设置好了响应头信息) //res.send() 综合体 //res.statusCode = 200; 设置状态码 //res.redirect() 重定向(对应状态码中的302/301) //res.sendStatus(404); 返回状态码并且附带一些状态码的描述信息 //...}); app.post(`/reg`, (req, res)=> { });
Express中间件
使用中间件的两大作用:
1、想要提取部分公共代码
2、想要在主体API逻辑处理前,做一些特殊处理(把传递的参数做特殊的处理)
…
let express = require('express'), app = express(); app.listen(8888, ()=> { console.log(`server is success~`); });//=>所有的客户端请求都会先执行这个中间件(然后执行NEXT后在进入下一个处理程序)app.use((req, res, next)=> { //next:执行下一个处理(当前这个中间件根据情况,如果需要走到下一个操作,必须执行NEXT,如果不需要,直接响应内容即可) if (req.query.name) { req.userName = req.query.name;//=>把获取的内容写在了userName自定义属性上 next(); } else { res.send(`name必须传递`); } });//=>只有请求的地址中包含`/user`的才会进入这个中间件app.use(`/user`, (req, res, next)=> { req.userName += '@'; next(); }); app.get(`/user`, (req, res)=> { res.send(`My name is ${req.userName}`); }); app.get(`/article`, (req, res)=> { res.send(`Article author is ${req.userName}`); });
Express中的路由router
在真实项目中,我们为了有效的管理接口,我们会把相同功能体系的接口进行归类;在实现的时候,也会分类实现(分组管理);
例如:
/user/signin
/user/signup/product/query
/product/search/log/info
GET获取
POST请求设置
同一个地址,因为请求方式不一样,实现不一样的功能
…此类操作,我们可以基于Express中的路由来完成
1、我们创建一个routers文件夹,在这个文件夹中存储所有功能模块的接口信息(分类存储)
2、在每一个路由模块中完成API接口的编写(举例:user模块)
let express = require('express'), router = express.Router();//=>router和app其实差不多router.use((req, res, next)=> { console.log(`ok`); next(); }); router.post(`/signin`, (req, res)=> { res.send('login success'); }); router.post(`/signup`, (req, res)=> { res.send('register success'); });module.exports = router;//=>把创建的路由导出,方便后续调取使用
3、在server中需要调取使用
let express = require('express'), app = express(); ... app.use(`/user`, require('./routers/user'));
Express中获取客户端传递的信息
客户端把信息传递给服务器:
1、问号传参(GET请求)
2、设置请求主体(POST请求)
3、设置请求头(cookie等信息传送)
…
问号传参 & 请求头
app.get(`/query`, (req, res)=> { console.log(req.headers);//=>通过REQ的HEADERS可以直接的获取请求头信息(想获取其中的某一个:REQ.HEADERS.HOST...) res.send(req.query);//=>通过REQ中的QUERY就可以获取问号传递的参数值(并且存储的方式是KEY:VALUE) });
请求主体
//=>基于传统的内置模块自己实现 app.use(`/reg`, (req, res, next)=> { //=>POST请求获取请求主体内容,需要基于事件完成 let str = ``; req.on('data', chunk=> { //=>正在接收请求主体中的内容(一般内容偏多) str += chunk; }); req.on('end', ()=> { //=>接收结束,此时STR存储的就是传递进来的信息 //=>客户端传递给服务器的信息一般都是字符串格式的(JSON字符串或者普通的FORMAT-DATA字符串[xxx=xxx&xxx=xxx]) //=>真实项目中我们还要把字符串转化为对象方式(方便操作) let data = require('querystring').parse(str);//=>这个内置模块就是把FORMAT-DATA变为对象键值对的方式存储 req.body = data;//=>把解析后的数据放到REQ的自定义属性上,在其它的方法中可以获取使用 next(); }); }); app.post(`/reg`, (req, res)=> { res.send(req.body); });
这种方式太麻烦了,我们可以使用第三方插件搞定刚才处理的事情:body-parser
let bodyParser = require('body-parser'); app.use(bodyParser.urlencoded({extended: false})); app.use(bodyParser.json()); app.use(bodyParser.raw()); app.use(bodyParser.text()); app.post(`/reg`, (req, res)=> { res.send(req.body); });
Express中静态文件的处理
基于express.static方法即可完成
let express = require('express'), app = express(); app.listen(8888, ()=> { console.log(`server is success~`); }); //=>真实项目中,我们一般都静态资源文件(HTML/CSS/JS/IMG...)存放在DIST或者LIB或者PUBLIC或者BUILD等指定的文件夹中 app.use(express.static('dist')); //=>大体实现原理 let fs = require('fs'), path = require('path'); let expressStatic = p=> (req, res, next)=> { let pathname = path.join(`${__dirname}/${p}`, req.path); fs.readFile(pathname, (err, data)=> { if (err) { //=>找不到指定的文件 next(); } else { //=>找到文件 res.sendFile(pathname); } }); }; app.use(expressStatic('dist'));
转载请注明: Vue教程中文网 - 打造国内领先的vue学习网站-vue视频,vue教程,vue学习,vue培训 » Express的基础语法和实战应用