美文网首页
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响应对象以及同源策略问题

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