node 第七天 手写前后端jsonp(一个古老的绕过跨域的方法)

  1. 前言
    jsonp并没有解决跨域, 而是绕过跨域去达成目的, 解决跨域的方法只有一种: 后端设置cors
  2. 基础模式
    前端请求接口, 告诉后端函数名(函数要先在前端定义)
html 复制代码
  <script>
    function getUserInfo(obj) {
      console.log(obj);
    }
  </script>
  <script src="http://127.0.0.1:3005/jsonp.js?fn=getUserInfo"></script>
  1. jsonp封装
    通过动态创建script标签, 给window挂一个全局函数, 然后在该函数的回调中取到后端数据
html 复制代码
  <script>
    function jsonp(url, queryData, success) {
      let fn = 'fn' + Date.now();
      let queryStr = Object.entries(queryData)
        .map(([key, val]) => {
          return key + '=' + val;
        })
        .join('&');
      const scriptEl = document.createElement('script');
      scriptEl.src = url + '?' + queryStr + '&fn=' + fn;
      const headEl = document.querySelector('head');
      headEl.appendChild(scriptEl);
      window[fn] = data => {
        success(data);
        delete window[fn];
        headEl.removeChild(scriptEl);
      };
    }
  </script>
  <script>
    function getUserInfo(obj) {
      console.log(obj);
    }
    jsonp(
      'http://127.0.0.1:3005/jsonp.js',
      {
        user: 'jian'
      },
      getUserInfo
    );
  </script>
  1. node后端部分(后端解决跨域的部分可省略)
js 复制代码
const http = require('http');
const fs = require('fs');
const path = require('path');
const url = require('url');

const server = http.createServer((req, res) => {
  res.setHeader('Access-Control-Allow-Origin', '*');
  res.setHeader('Access-Control-Allow-Headers', 'Content-Type');
  res.setHeader('Access-Control-Allow-Methods', 'POST, GET, OPTIONS, DELETE');
  if (req.method === 'OPTIONS') {
    res.writeHead(200);
    res.end();
  } else if (/^\/jsonp.*/.test(req.url)) {
    let { query } = url.parse(req.url, true);
    res.writeHead(200, { 'Content-Type': 'text/plain' });
    let result = JSON.stringify({ id: 1, name: '张三' });
    setTimeout(() => {
      res.end(`${query.fn}(${result})`);
    }, 2000);
  }
});
server.listen(3005);

jsonp解决跨域问题, 到现在已经是古老的洪水猛兽, 就像声明变量关键字var一样

相关推荐
我不叫武1 小时前
一个用 Rust 写的离线编码查询桌面工具
前端
Web4Browser2 小时前
指纹浏览器 API 自动化怎么接:启动 Profile、获取 CDP 端点并连接自动化框架
前端·网络·typescript·自动化
Patrick_Wilson2 小时前
从 React 到 Flutter:写给前端的一张跨端知识地图
前端·flutter·react.js
颜酱2 小时前
06 | 把 meta_config 同步进 MySQL(生成阶段)
前端·人工智能·后端
OpenTiny社区3 小时前
Loop Engineering:让 AI Agent 自己跑起来的工程方法
前端·github
IT_陈寒3 小时前
SpringBoot自动配置坑了我一周,原来问题这么蠢!
前端·人工智能·后端
kyriewen3 小时前
我review了一份Vibe Coding写的前端代码——能跑,但5个地方迟早要命
前端·javascript·ai编程
REDcker4 小时前
Cesium三维WebGIS入门详解
前端·gis·web·cesium·webgis
0暗影流光04 小时前
十倍效能提升——Web 基础研发体系的建立
前端
前端一课4 小时前
用Agent Skill重构代码:300行缩至30行的实战教程
前端