NodeJs中使用JSONP和Cors实现跨域

news2024/11/17 16:53:43

跨域是为了解决浏览器请求域名,协议,端口不同的接口,相同的接口是不需要实现跨域的。

1.使用JSONP格式实现跨域

实现步骤

  1.  动态创建一个script标签
  2.  src指向接口的地址
  3.  定义一个函数和后端调用的函数名一样

实现代码 -- 在nodejs中使用http内置模块起一个服务,端口号为3000

const url = require('url')

const http = require('http')

const server = http.createServer((req,res)=>{
    if(req.url === '/favicon.ico') return  //图标忽略 --- 图标地址也会请求后台服务
    const {query,pathname} = url.parse(req.url,true)  //若加上true这个参数,query字符串参数会自动转成对象格式

    //设置头部信息 状态为200 内容为JSON格式  如果要返回html片段这设置为text/html
    res.writeHead(200, { 'Content-Type': 'application/json' });

    if(pathname == '/api/data'){
        //定义对象,返回给前端的   数据
        const obj = {code:200,message:'jsonp形式返回给前端'}
        //返回一个JSON调用的函数
        res.end(`toFront(${JSON.stringify(obj)})`)
    }else{
        //简单处理了
        res.writeHead(404, { 'Content-Type': 'application/json' });
        res.end('404')

    }

   //jsonp跨域操作
   //  console.log(req.url) //获取请求除域名外的地址 例如 localhost:300/api  只获取/api
})
server.listen(3000,()=>{
    console.log("服务已启动")
})

在客户端的代码

 <script type="text/javascript">
    //jsonp跨域步骤
    //1.动态创建一个script标签
    const newscript = document.createElement('script')
    //2.src指向接口的地址
    newscript.src = 'http://localhost:3000/api/data'
    document.body.appendChild(newscript  )
    //3.定义一个函数和后端调用的函数名一样
    function toFront(res){
      //后台返回的数据  这个函数是后台服务调用过来的
      console.log(res) 
    }
  </script>

执行的结果 ,返回一个JSON格式的文档

 2.使用cors实现跨域

核心是将响应的数据头部设置一个'access-control-allow-origin':'*',允许所有接口来访问浏览器,把浏览器允许的接口设置开放就好了。若不设置会出现明显的跨域报错问题

下面设置下头部信息

const server = http.createServer((req,res)=>{
    if(req.url === '/favicon.ico') return  //图标忽略 --- 图标地址也会请求后台服务
    const {query,pathname} = url.parse(req.url,true)  //若加上true这个参数,query字符串参数会自动转成对象格式

    //设置头部信息 状态为200 内容为JSON格式  如果要返回html片段这设置为text/html
    //核心代码需要将头部的access-control-allow-origin 设置为*
    res.writeHead(200, { 'Content-Type': 'application/json','access-control-allow-origin':'*'});



    if(pathname == '/api/data'){
        //定义对象,返回给前端的   数据
        const obj = {code:200,message:'cors形式返回给前端'}
        //返回一个JSON调用的函数
        res.end(`${JSON.stringify(obj)}`)
    }else{
        //简单处理了
        res.writeHead(404, { 'Content-Type': 'application/json' });
        res.end('404')

    }

    //jsonp跨域操作
    //  console.log(req.url) //获取请求除域名外的地址 例如 localhost:300/api  只获取/api
})
server.listen(3000,()=>{
    console.log("服务已启动")
})

 客户端请求

 //cors跨域
    fetch('http://localhost:3000/api/data')
        .then(res=>res.json())
        .then(res=>console.log(res))

结果如下

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1082460.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【Mysql】重新认识mysql(一)

参考Mysql是怎么运行的&#xff0c;并结合实际的工作经验对mysql的知识进行总结。 Mysql架构 从大体上来说&#xff0c;Mysql是C/S架构。以我们平时使用的QQ为例&#xff0c;它其实是由两部分组成的&#xff0c;一部分是客户端程序,&#xff0c;一部分是服务器程序。客户端可…

【深蓝学院】手写VIO第6章--视觉前端--作业(SVD分解部分复习)

0. 题目 T1. 奇异值分解需要补&#xff0c;看这篇博客&#xff0c;讲的很好。 总结一下&#xff0c;关于奇异值分解(Singular Value Decomposition&#xff0c;SVD )有以下内容摘抄自该博客&#xff0c;关于SDV分解的部分应该是摘自李航《统计学习方法里面的》&#xff1a; 1…

互联网性能和可用性优化CDN和DNS

当涉及到互联网性能和可用性优化时&#xff0c;DNS&#xff08;Domain Name System&#xff09;和CDN&#xff08;Content Delivery Network&#xff09;是两个至关重要的元素。它们各自发挥着关键作用&#xff0c;以确保用户能够快速、可靠地访问网站和应用程序。在本文中&…

项目管理之常见七大问题挑战

在当今复杂多变的市场环境下&#xff0c;企业为了生存和发展&#xff0c;必须不断应对和解决各种挑战。其中&#xff0c;项目管理作为企业运营及项目交付等的重要组成部分&#xff0c;也面临着七大问题挑战。这些挑战不仅影响着项目的成功实施&#xff0c;也对企业的发展产生着…

[Spring] SpringMVC 简介(一)

目录 一、SpringMVC 简介 1、什么是 MVC 2、什么是 SpringMVC 3、SpringMVC 实现原理 4、SpringMVC 的特点 二、简单案例 1、引入依赖 2、在 web.xml 中配置前端控制器 DispatcherServlet 3、创建 SpringMVC 的配置文件 4、创建请求控制器 5、测试页面 6、访问不到 …

Go 存储系列:B+树存储引擎 boltdb

boltdb 介绍 boltdb是一个纯go编写的支持事务的文件型单机kv数据库 支持事务&#xff1a; boltdb数据库支持两类事务&#xff1a;读写事务、只读事务。这一点就和其他kv数据库有很大区别文件型&#xff1a; boltdb所有的数据都是存储在磁盘上的&#xff0c;所以它属于文件型数…

信号与系统第一章

文章目录 1.1连续信号与离散信号1.1.2信号能量与功率能量讨论无穷区间内功率和能量&#xff1a;无限区间内的平均功率&#xff1a;利用上述定义区分三种重要信号 1.2自变量的变换1.2.1举例基本变换1.2.2周期信号1.2.3偶信号与奇信号 1.3指数信号与正弦信号1.3.1连续时间复指数信…

LeetCode(力扣)416. 分割等和子集Python

LeetCode416. 分割等和子集 题目链接代码 题目链接 https://leetcode.cn/problems/partition-equal-subset-sum/ 代码 class Solution:def canPartition(self, nums: List[int]) -> bool:sum 0dp [0]*10001for num in nums:sum numif sum % 2 1:return Falsetarget …

python之计算市场技术指标

1、MA MA指标是一种常用的技术指标&#xff0c;它是通过计算一定时间内的股价平均值来反映股价趋势的指标。通常&#xff0c;MA指标越平滑&#xff0c;就能更好地反映出股价的长期趋势。 MA指标的作用是帮助投资者识别股票价格的趋势。当股票价格的MA指标向上运动时&#xff…

分类网络的评价指标

之前一直是做目标检测的研究&#xff0c;在目标检测中主要有两个任务&#xff0c;一个是分类回归&#xff0c;一个是位置回归&#xff0c;所用的评价指标有&#xff1a;AP&#xff0c;mAP&#xff0c;Recall&#xff0c;Precision&#xff0c;F1值&#xff0c;前两个用的一般最…

论文学习记录--零样本学习(zero-shot learning)

Socher R, Ganjoo M, Manning C D, et al. Zero-shot learning through cross-modal transfer[J]. Advances in neural information processing systems, 2013, 26. 注&#xff1a;中文为机翻 zero-shot learning&#xff1a;通过学习类别之间的关系和属性&#xff0c;使得模型…

每日leetcode_LCP01猜数字

每日leetcode_LCP01猜数字 记录自己的成长&#xff0c;加油。 题目出处&#xff1a;LCP 01. 猜数字 - 力扣&#xff08;LeetCode&#xff09; 题目 解题 class Solution {public int game(int[] guess, int[] answer) {int count 0;for (int i 0 ; i< guess.length; i){…

修正两个shapefile之间的数字化错误

目录 一、数据输入 二、测量拓扑容差 三、启用编辑 四、使用拓扑编辑工具 五、建立图层拓扑关系 六、待修改的图层设置为唯一可选图层 七、编辑折点 八、拖动折点至land图层折点 一、数据输入 二、测量拓扑容差 拓扑容差约为4~5m 三、启用编辑 四、使用拓扑编辑工具 五…

系统移植--前言

移植 不同架构的处理器指令集不兼容&#xff0c;即便是相同的处理器架构&#xff0c;板卡不同驱动代码也不兼容 Linux是一个通用的内核并不是为某一个特定的处理器架构或板卡设计的&#xff0c;所以从官方获取Linux源码后我们要先经过相应的配置使其与我们当前的硬件平台相匹配…

Java数据结构第十七章、手撕位图

给40亿个不重复的无符号整数&#xff0c;没排过序。给一个无符号整数&#xff0c;如何快速判断一个数是否在这40亿个数中。【腾讯】 1. 遍历&#xff0c;时间复杂度O(N) 2. 排序(O(NlogN))&#xff0c;利用二分查找: logN 3. 位图解决 数据是否在给定的整形数据中&#xff0c;结…

重置Mac电脑的SMC怎么操作,重置SMC方法分享~

SMC 负责管理 Mac 上的电源。重置 SMC 可以解决一些与电源或散热管理相关的不常见问题。今天重置SMC教程给大家分享一下&#xff0c;需要的小伙伴看过来&#xff01; 如何判断您是不是需要重置 SMC 若出现以下症状&#xff0c;则表明可能需要重置 SMC&#xff1a; 电池无法充电…

Exim 中的漏洞!

我们将继续分享有关流行网络安全漏洞的最新信息。 Exim 中的 CVE-2023-42115漏洞&#xff01; CVE-2023-42115是开源 Exim 4 SMTP 邮件服务器项目中的一个远程代码执行漏洞。问题的严重性不容小觑。据我们的分析师称&#xff0c;目前网络中存在漏洞的 Exim 服务器超过 350 万台…

18基于matlab的二阶动态系统的滑膜控制,程序已调通,可直接运行。标价为程序价格,不包含售后。程序保证可直接运行。

基于matlab的二阶动态系统的滑膜控制&#xff0c;程序已调通&#xff0c;可直接运行。标价为程序价格&#xff0c;不包含售后。程序保证可直接运行。 18matlab滑膜控制 (xiaohongshu.com)

【C++入门】命名空间详解(从零开始,冲击蓝桥杯)

C入门 命名空间 南喵小鸡汤程序员可以让步&#xff0c;却不可以退缩&#xff0c;可以羞涩&#xff0c;却不可以软弱&#xff0c;总之&#xff0c;程序员必须是勇敢的。一 . 命名空间的介绍二.命名空间的实际应用1.为什么要有命名空间我们在使用变量时,通常会为他定义一个名字,在…

graphviz 绘制森林

代码 digraph Forest {node [fontname"Arial", shapecircle, stylefilled, color"#ffffff", fillcolor"#0077be", fontsize12, width0.5, height0.5];edge [fontname"Arial", fontsize10, color"#333333", arrowsize0.5];/…