美文网首页
Express响应对象以及同源策略问题

Express响应对象以及同源策略问题

作者: 听书先生 | 来源:发表于2022-03-27 11:57 被阅读0次

响应对象是指服务器向客户端响应数据的对象,包含所有要响应的内容。

  • send()方法:
    向页面发送各种数据
    res.send(data):data可以是任意数据类型(模板、json数据均可以)

这是因为send()方法的第一个参数是状态码,因此当你传入数字进去的时候,会被误认为传入的状态码的值,因此会导致报错。

app.get('/getData', (req, res, next) => {
   // res.send(1);
   // res.send('111');
   res.send({name:'11'})
})
app.use((err, req, res, next) => {
   res.status(500).send(`页面异常.`); // 如果请求返回的状态码为500,那么抛出错误
})

  • sendFile()方法:
    读取本地的文件数据流
const express = require("express");
const path = require("path");
const bodyParser = require("body-parser");

const app = express();

// 拦截所有请求,配置body-parser模块
app.use(bodyParser.json());
app.use(bodyParser.urlencoded({extended: true})); // 一般设置为true

app.get('/qryStudent', (req, res, next) => {
   let { uuid } = req.query;
   res.sendFile(path.join(__dirname, `./public/students/${uuid}.json`), (error, data) => {
      if(error) {
         throw error;
      } else {
         console.log('查询成功...');
      }
   })
})
app.use((err, req, res, next) => {
   res.status(500).send(`页面异常.`); // 如果请求返回的状态码为500,那么抛出错误
})

app.listen(3000, () => console.log('http://localhost:3000'))
图1.png
  • res.json()方法:
    res.json方法可以返回一个json对象的数据出去
app.get('/qryStudent', (req, res, next) => {
   res.json({
      name:'张三',
      age:20,
      province:'江苏省'
   })
})
图2.png
  • res.download()方法:
    用于下载当前目录下的文件。
app.get('/download', (req, res, next) => {
   res.download(path.join(__dirname, './assets/image.zip'));
})
图3.png
  • res.end()方法:
    用于结束与客户端的响应。
app.get('/qryData', (req, res, next) => {
   res.end('响应完成');
})
同源策略问题

如果两个 URL 的 protocolporthost 都相同的话,则这两个 URL 是同源。这个方案也被称为“协议/主机/端口元组”.

代码示例:
首先我们模拟服务器A发送接口/qryData数据,让模拟的前端页面去调用,fetch是浏览器自带的ajax的方法。

const express = require("express");
const path = require("path");
const bodyParser = require("body-parser");

const app = express();

// 拦截所有请求,配置body-parser模块
app.use(bodyParser.json());
app.use(bodyParser.urlencoded({extended: true})); // 一般设置为true

// 模拟服务器A发送接口数据
app.get('/qryData', (req, res, next) => {
   res.send({
      name:'aa',
      age:20
   })
})

// 访问静态资源文件
app.use(express.static(path.join(__dirname, '/public')));

app.use((err, req, res, next) => {
   res.status(500).send(`页面异常.`); // 如果请求返回的状态码为500,那么抛出错误
})

app.listen(3000, () => console.log('http://localhost:3000'))

模拟的前端页面通过fetch方法去调用:

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>首页</title>
</head>
<body>
    <p>首页</p>
    <script>
        // fetch是浏览器自带的ajax
        fetch('/qryData').then(res => res.json()).then(data => {
            console.log(data);
        })
    </script>
</body>
</html>
图4.png

但是当我们更换为两个不同端口号的路径进行访问时,就会出现跨域问题

// 后台A发送接口数据
app.get('/qryData', (req, res, next) => {
   res.send({
      name:'aa',
      age:20
   })
})

// 前端B请求接口获取数据
<body>
    <p>首页</p>
    <script>
        // fetch是浏览器自带的ajax
        fetch('http://localhost:3000/qryData').then(res => res.json()).then(data => {
            console.log(data);
        })
    </script>
</body>
图5.png

这样就造成了跨域,导致数据访问不到。

  • 跨域的解决方案:
    1、CORS解决跨域
    后台在写接口的时候修改'Access-Control-Allow-Origin'的值为*
// 模拟服务器A发送接口数据
app.get('/qryData', (req, res, next) => {
   res.set('Access-Control-Allow-Origin', '*'); // 手动去设置
   res.send({
      name:'aa',
      age:20
   })
})
图6.png

2、JSONP解决跨域问题
jsonp处理跨域的方法原理:后台返回的数据实际上还是一个json对象数据,但是前端在使用jsonp的时候会通过callback传递一个参数过去,这个参数值会为一个function的函数名作为脚本去执行。

// 模拟服务器A发送接口数据
app.get('/qryData', (req, res, next) => {
   let { id } = req.query;
   res.jsonp({
      name: id,
      age: Math.floor(Math.random() * 20 + 18)
   })
})

相关文章

  • Express响应对象以及同源策略问题

    响应对象是指服务器向客户端响应数据的对象,包含所有要响应的内容。 send()方法:向页面发送各种数据res.se...

  • Nginx解决跨域问题

    同源策略 同源策略是浏览器最基本的安全策略,在同源策略下,当本域发起跨域请求时,客户端会限制加载响应的数据。这也就...

  • 如何解决跨域问题

    问题解析:(1)考察目标 (2)题目分析 跨域出现的原因:同源策略。 什么是同源策略:同源策略(Sameorigi...

  • 出现跨域问题的原因及其解决方法

    出现跨域问题的原因: 同源策略 同源策略 三同 协议相同 域名相同 端口相同 同源策略目的 保证用户信息安全,防止...

  • 同源策略和跨域

    什么是跨域问题? 为什么会出现跨域问题? 因为浏览器的同源策略(同源指的是:协议+域名+端口相同)。 同源策略是浏...

  • 同源策略以及CORS

    同源策略 只有协议+端口+域名都一模一样,才允许发AJAX请求!一模一样一模一样一模一样! http://baid...

  • 同源策略以及突破

    既然要突破同源策略,那就要知道什么是同源策略,要不然突破什么呢?首先看看一个完整的URL的结构 同源策略是指: 协...

  • 同源策略以及应用

    同源策略 含义 1995年,同源政策由 Netscape 公司引入浏览器。目前,所有浏览器都实行这个政策。最初,它...

  • Django-->CORS跨域

    要解决跨域问题首先要了解同源以及非同源: 浏览器同源策略是:协议、主机ip 和 端口port 都相同的两个地址是同...

  • 关于同源策略你可能也有的一些疑问

    同源策略的含义详解 含义一(DOM层面的同源策略):限制了来自不同的”document”对象或js脚本,对当前“d...

网友评论

      本文标题:Express响应对象以及同源策略问题

      本文链接:https://www.haomeiwen.com/subject/hqisjrtx.html