如何在 Express.js 中设置代理?

阅读时长 4 分钟读完

在现代 Web 应用中,我们经常需要设置代理来解决一些跨域访问的问题。本篇文章将详细讲解如何在 Express.js 中设置代理。

什么是代理?

HTTP 代理简单来说就是一个“跳板机”,客户端通过代理发送 HTTP 请求,再由代理转发请求到目标服务器,目标服务器将响应发送给代理,代理再将响应返回给客户端。因为代理位于客户端和服务端之间,所以可以在代理中进行一些额外的逻辑处理,比如修改请求头、响应头、缓存请求结果等。

为什么要设置代理?

在 Web 开发中,你可能会遇到以下几种情况需要设置代理:

  • 跨域访问:浏览器有同源策略,不能在 JS 中直接访问不同域名的资源。而通过代理,可以让客户端请求代理服务器,再由代理服务器请求目标服务端,绕过同源策略,实现跨域访问。
  • 转发请求:比如你的后台服务跑在另一台机器上,而前端服务跑在另一台机器上,你需要在前端服务中设置代理,把从前端发出的请求通过代理转发到后台服务上。
  • 动态调整请求:比如代理可以在转发请求时,动态修改 header,body 或 query 参数,使得目标服务端能够识别并返回正确的结果。

如何设置代理?

接下来将详细讲解如何在 Express.js 中设置代理。我们将使用 http-proxy-middleware 实现代理功能。

  1. 安装依赖
  1. 创建代理中间件
-- -------------------- ---- -------
-- - --------------------- -- ---------- ----
----- - --------------------- - - ---------------------------------

-- -------
----- -------- - -----------------------
  ------- ------------------------- -- -----------
  ------------- ----- -- ------- ---- ------------------- ------
  ------------ -
    ----------- --- -- ---- ------- ---------------- ---------- -- ----
  --
  ------- -
    -- -----------
    ------- ------------------------
    ------------- ----------------------
  --
---

-------------- - ---------
  • target:要代理的目标服务器地址。可以是字符串(表示目标服务器地址,比如 http://localhost:8080),也可以是一个对象(表示目标服务器的选项,比如 {protocol: 'http', host: 'localhost', port: 8080})。
  • changeOrigin:是否改变请求的 host 头部,以便服务端识别为同域请求。默认为 false。
  • pathRewrite:重写要代理的路径。比如要代理路径为 /server/api/user,但是目标服务器上实际的路径是 /api/user,那么可以用 { '^/server': ''} 的规则进行重写。
  • router:设置特殊的代理路由规则。这个选项可以实现更细粒度的代理控制。键(如 /api)为路由规则,值(如 http://localhost:3000)为要代理的目标服务器地址。
  1. 使用代理中间件
-- -------------------- ---- -------
----- ------- - -------------------
----- -------- - ----------------------

----- --- - ----------

-- -------
------------------ ----------

-- ----
---------------- -- -- -
  ------------------- -- ------- -- ------------------------
---

总结

本篇文章介绍了 HTTP 代理的概念、需要设置代理的场景以及如何在 Express.js 中设置代理。实践证明,使用 http-proxy-middleware 可以非常方便地实现代理功能,并且能够支持比较复杂的代理场景。希望这篇文章对于需要进行代理设置的前端开发者有一定的帮助。

来源:JavaScript中文网 ,转载请注明来源 https://www.javascriptcn.com/post/64f59e3bf6b2d6eab3e674f3

纠错
反馈