美文网首页
express 转发图片请求及原理分析

express 转发图片请求及原理分析

作者: 没头脑很不高兴 | 来源:发表于2019-06-24 18:58 被阅读0次

    怎么用

    有的时候, 前端同学用 canvas 合成图片的时候, 会遇到图片跨域问题(比如合成用户的微信头像和其他图片), 虽然前端也有一些办法去避免这个问题, 但是做起来还是比较麻烦的, 兼容性也不太好. 为了让前端同学不那么麻烦, 可以在自己的服务器做一个转发

    代码如下(在 express 下)

    // 命令行运行 npm install axios 
    const axios = require('axios')
    const router = express.Router()
    
    router.use('/avatar', (req, res) => {
      axios({
        method: 'get',
        // 这里拼接图片的地址
        url: 'http://thirdwx.qlogo.cn' + req.path,
        responseType: 'stream'
      })
        .then(response => {
          // pipe 一下就好了...
          response.data.pipe(res)
        })
    
    })
    

    原理

    以前我认为 express 的 response 是作者自己定义的一个对象, 类似下面这种

    const res = {
      send: ...,
      header: ...,
      json: ...,
      ...
    }
    

    但其实不是, 它继承于一个 Node.js 标准库 http 中的一个对象

    // 源码中, response.js 下
    
    var res = Object.create(http.ServerResponse.prototype)
    

    再去文档看一下 http.ServerResponse 是什么

    image.png

    因为 http.ServerResponse 是继承自流的, 看名字就知道这是用于 一次 http 请求的响应, 所以在 pipe 之后, 就会将数据返回给客户端了

    相关文章

      网友评论

          本文标题:express 转发图片请求及原理分析

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