【NodeJS】服务器相关知识

服务器相关知识

一. 服务器重定向

  • 就是服务器主动修改地址, 一般用于网站引导注册登录功能(访问首页是自动跳转到登录页)
  • 服务器重定向用响应头的302状态码实现
app.use((req,res)=>{
    res.writeHead(302,()=>{
        Location: 'http://127.0.0.1:8088/login.html';
    });
    res.end();
})

二. IP和域名

  • IP其实就相对于服务器在网络中的门牌号,因为IP地址是一个32位的二进制数,不方便记忆所以有了域名。

    域名可以理解成IP的代号,使人更方便访问互联网。而不用去记IP数串。

    DNS服务器(域名解析服务器)可以将域名和IP地址相互映射,把域名对应的ip解析出来,然后通过ip找到服务器.

    如:https://www.baidu.com/

    www.baidu.com就是域名, 可以访问百度

    ip:14.215.177.38 也可以访问百度。但是显然域名更好记

  • 可以通过在终端输入ping + 网址查看网站ip

三.中间件

  • 就是开启服务器之后和路由响应之前要执行的函数。可以操作请求对象req和响应对象res

    中间件的功能:

    1. 中间件可以执行任何代码
    2. 更改请求和响应对象
    3. 结束请求-响应周期
    4. 调用堆栈中的下一个中间件
    // 导包
    const express = require('express');
    const bodyParser = require('body-parser');
    
    // 创建服务器
    const app = express()
    
    // 中间件
    app.use((req,res,next)=>{
        console.log('LOGGED')
        next(); // 不能少
    });
    
    
    /**
     * 写接口(注册路由)
     */
    app.get('/go',(req,res)=>{
        res.send('里好啊');
    })
    
    
    // 开启服务器
    app.listen(8088, () => {
        console.log('服务器已开启')
    })
    

    中间件里必须要有next(); 否则会挂起,不继续往下执行一直转圈

四.跨域

  • 游览器使用Ajax时,如果请求的接口地址和当前打开的页面地址不同源,称之为跨域
    • 游览器只有用ajax发送请求才会出现跨域。href属性和src属性不会出现跨域
    • 游览器使用ajax向不同源的接口发送请求,称之为跨域访问
    • 协议、地址和端口都一样叫同源,只要有一个不同就为不同源
  • 为啥要区分同源和不同源
    • 为了保护电脑的安全性,游览器不允许页面向不同源的接口请求数据,如果接口和网页不同源,游览器认为是2个不同的服务器
1. 解决跨域问题
  • JSONP方法

    • 曾经专门解决各种跨域问题,但是随着时间现在慢慢淡出历史舞台
    • 是前后端配合使用的
    • 原理:通过动态创建script标签,用script标签的src请求没有跨域限制的特性来获取资源
  • CORS方法

    • 目前主流的方案,很简单直接让后端设置响应头,允许资源共享

      app.use((req,res,next)=>{
          // 设置响应头,允许资源被访问|共享
          res.setHeader('Access-Control-Allow-Origin', '*'); // *代表所有请求路径都可以请求
          next()
      })
      

      用中间件的方式设置资源共享,就不用在接口挨个设置

      res.setHeader(‘Access-Control-Allow-Origin’,’*’);

      *代表所有请求路径都可以请求

      • 更简单的写法,第三方模块cors
      // 导包
      const express = require('express');
      var cors = require('cors');
      
      // 创建服务器
      const app = express()
      
      // 用第三方模块cors设置
      app.use(cors())
      

      就app.use(cors())一句话搞定

      效果和上面写的一样

2. jsonp的原理
  • 通过动态创建script标签,用script标签的src请求没有跨域限制的特性来获取资源

  • 就是前端页面通过src向后端发请求,后端通过传参方式向前端页面发内容

    • 前端代码

      <!DOCTYPE html>
      <html lang="en">
      
      <head>
          <meta charset="UTF-8">
          <meta name="viewport" content="width=device-width, initial-scale=1.0">
          <title>jsonp的原理</title>
          <script src="../../jQuery/jquery-3.5.1.js"></script>
      </head>
      
      <body>
          <button class="btn">获取接口资源</button>
          <script>
              function fn(backData) {
                  console.log(backData);
              }
      
              $(function (){
                  $('.btn').on('click', () => {
                      var script = document.createElement('script');
                      $(script).attr('src', 'http://127.0.0.1:8086/a?callback=fn');
                      $('body').append(script);
                  })
              })
          </script>
      </body>
      </html>
      

      动态创建script设置src

      然后通过src里的callback整理有的函数名传给后端

    • 后端代码

      // 导包
      const express = require('express');
      
      // 创建服务器
      const app = express()
      
      app.get('/a',(req,res)=>{
          // 后端要返回给前端的内容是
          // {'name':'ash','age':29}
      
          // 所以写死返回fn()的调用不合理
          // 解决办法,前端吧准备好的函数名用参数带过来
          let callBack = req.query.callback;  // 这里可以拿到前端传过来的事先准备好的函数名
          res.send(`${callBack}({'name':'ash','age':29});`) // 通过传参方式向前端发内容
      
      })
      
      app.listen(8086,()=>{
          console.log('服务器开启了')
      })
      

      可以通过callback获取前端有的函数名。

      然后通过传参方式向前端发内容

  • jquery使用jsonp

  • <!DOCTYPE html>
    <html lang="en">
    <head>
        <meta charset="UTF-8">
        <meta name="viewport" content="width=device-width, initial-scale=1.0">
        <title>jquery使用jsonp</title>
        <script src="../../jQuery/jquery-3.5.1.js"></script>
    </head>
    <body>
        <button class="btn">获取接口资源</button>
        <script>
            $(function () {
                $('.btn').on('click', () => {
                    $.ajax({
                        url:'http://127.0.0.1:8086/a',
                        dataType:'jsonp', // 自动创建script标签
                        success:function(backData){
                            console.log(backData);
                        }
                    })
                })
            })
        </script>
    </body>
    </html>
    

    接口如果支持jsonp

    那jquery使用jsonp只要加上dataType:'jsonp’就可以

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值