express

一,express基础

新建serve.js, npm init -y, 安装express包

// 1.引入express
const express = require("express");

// 2.创建服务器应用实例,app->application
const app = express();

/* 4.注册路由(接口)
    app.get(参数一,参数二)->创建get路由
    参数一:路由路径
    参数二:回调函数,接收两个实参
        request->请求报文对象
        response->响应报文对象
*/ 
app.get("/test",function(request,response){
    console.log('/test');
    // 通过response.end方法可以返回数据
    response.end('haha')
})

/*
    功能:测试接口,获取数据,跑通前后端
    method:GET
    接口地址:/test
    必传参数:无
*/

app.post("/login",function(request,response){
    console.log("/login");
    response.end("login success!")
})


// 3.运行服务器应用,并监听端口
// 端口号可以任意选择,但是不要小于1000
app.listen("3001",function(err){
    if(err){
        console.log('服务器连接失败',err)
    }else{
        console.log('服务器启动成功,启动于http://localhost:3001上')
    }
})

 

路由相关

const express =require('express');

const app = express();

/*
面试题一:什么是路由
1)路由就是对象
2)可以使用键值对表示 key:value
3)key:路由路径
4)value:请求返回的数据
5)let obj={name1:xiaoming}  obj.name1->xiaoming

面试题二:路由分类
1.前端路由
    1)前端路由的解析是由js库负责的(vue-router,react-router-dom)
    2)前端路由不走网络传输层
    3)前端路由获取到的是'组件'
    总结:前端路由就是路由路径和路由组件之间的映射关系

2.后端路由
    1)后端路由的解析是由服务器负责
    2)需要前端发送请求触发
    3)后端路由获取到的是响应数据(json)
    总结:后端路由就是路由路径+请求方式,与回调函数之间的映射关系
*/

/*
路由传参:
1.GET
    1)query传参-> url?key=value&key2=value2 ->req内部有请求的所有的数据->req.query
    2)params传参
        1.需要提前声明占位符
        2.读取方式:req.params
        3.params的key来源于声明占位符时候(:后面的内容)
2.POST
    1)query传参-> url?key=value&key2=value2 ->req内部有请求的所有的数据->req.query
    2)params传参
        1.需要提前声明占位符
        2.读取方式:req.params
        3.params的key来源于声明占位符时候(:后面的内容)
    3)body(请求体传参)
        1.读取方式:req.body->暂时不行->后面可以通过插件搞定
        2.由于前两种数据拼接在URL中,所以数据量较小
            请求体传参好处,数据量可以很大
        3.上面两种传参方式是在URL中以明文传送,请求体传参会以密文传送,安全性较高
            req.on("data",function(){

            })

 */

/*
    编码格式
            Node.js使用UTF-8
            01->A
            浏览器默认使用GBK->GB2312
            01->a

    res的api
            1)res.end(数据)->直接将数据返回给前端,不进行任何处理
            2)res.send(数据)->根据数据内容,修改了Content-Type内部的编码格式,并返回
            3)res.json(数据)->把数据转换成json字符串,根据数据内容,修改了Content-Type内部的编码格式,并返回
            4)res.cookie()->用于设置cookie
            5)res.set(配置对象)->用于设置响应头配置
            6)res.status(状态码)->用于设置本次响应的状态码
*/

app.get('/test/:id',function(req,res){
    console.log('get /test');
    // console.log(req.query)
    // console.log(req.query.username)
    // console.log(req.query)
    console.log(req.params)
    res.set({
        "Content-Type":"text/html;charset=utf-8"
    })
    res.status(404).end('请求失败')
    // res.send('haha哈哈')
    // res.json({name:"哈哈"})
})

app.post('/test',function(req,res){
    console.log('post /test');
    // console.log(req.query)
    // console.log(req.query.username)
    // console.log(req.params)
    // console.log(req.body)
    req.on("data",function(msg){
        console.log(msg.toString());
    })
    res.end('xixi')
})


app.listen("3001",function(err){
    if(err){
        console.log('服务器连接失败',err)
    }else{
        console.log('服务器启动成功,启动于http://localhost:3001上')
    }
})

 

中间件使用,需要下载connect-multiparty包

 
const express =require('express');
const path =require('path');
const multiparty = require('connect-multiparty');

const app = express();

/*
    什么是中间件
        数据类型:函数
        作用:
            1.扩展一些功能
            2.修改请求头,响应头
            3.执行下一个中间件
        体现形式:
            1)function(req,res,next){}
            2)req->请求报文对象
            3)res->响应报文对象
            4)next->执行下一个中间件
    中间件的特点:
        1)所有的请求,无论地址,无论请求方式都会经过中间件
        2)如果上一个中间件不放行,下一个不会执行,尽量不要在前面的中间件去返回数据,否则后面中间件可能会出问题
        3)无论是路由,还是中间件,先匹配到谁,就先执行谁

    内置中间件:
        1)express.static(绝对文件夹路径)->它适用于配置静态文件路径
            path模块 -> 当前文件绝对路径__dirname
            当前端请求文件时,回去publish文件夹下寻找
            express.static(path.resolve(__dirname,"./publish"))
        2)express.json()->它适用于解析raw中的json请求体数据
        3)express.urlencoded()->它适用于解析xxx-form-urlencoded中的请求体数据

    第三方中间件:
        包名:connect-multiparty
        用处:适用于解析form-data格式的请求体参数
        用法:
            全局使用:app.use(multiparty())
            局部使用:app.post('/test',multiparty(),function(req,res){
                        console.log('body',req.body);
                        res.send('post /test success')
                    })
*/

//自定义中间键
// app.use(function(req,res,next){
//     console.log('hello world!!!')
//     res.send('你已成功到达中间件1')
//     // next();
// })

// app.use(function(req,res,next){
//     console.log('hello world')
//     res.send('你已成功到达中间件2')
// })

// console.log(__dirname)
// console.log(path.resolve(__dirname,"./publish"));
app.use(express.json())
    .use(express.urlencoded({extended:true}))
 // 直接在改文件夹下寻找资源
    .use(express.static(path.resolve(__dirname,"./publish")))
    // .use(multiparty());



app.get('/test',function(req,res){
    console.log("你已成功到到/test")
})

app.post('/test',multiparty(),function(req,res){
    console.log('body',req.body);
    res.send('post /test success')
})

app.post('/test1',function(req,res,next){
    console.log('body',req.body);
    res.send('post /test success')
    next();
})

app.use(function(){
    console.log('路由之后的中间键')
})

app.listen("3001",function(err){
    if(err){
        console.log('服务器连接失败',err)
    }else{
        console.log('服务器启动成功,启动于http://localhost:3001上')
    }
})

 

posted @ 2020-09-15 07:33  全情海洋  阅读(504)  评论(0编辑  收藏  举报