zoukankan      html  css  js  c++  java
  • 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上')
        }
    })
  • 相关阅读:
    Spring@Profile注解
    day 32 子进程的开启 及其用法
    day 31 udp 协议SOCK_DGRAM
    day 30 客户端获取cmd 命令的步骤
    day 29 socket 理论
    day 29 socket 初级版
    有关 组合 继承
    day 27 多态 接口 类方法 静态方法 hashlib 摘要算法模块
    新式类和经典类的区别
    day 28 hasattr getattr serattr delattr 和带__内置__ 类的内置方法
  • 原文地址:https://www.cnblogs.com/fsg6/p/13670931.html
Copyright © 2011-2022 走看看