Express的基础语法和实战应用

Vue干货 小白 暂无评论

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的基础语法和实战应用

喜欢 ()or分享