nodejs抓取动态网页(用nodejs配置代理服务器,我们需要借助两个npm包,一个)

优采云 发布时间: 2022-03-28 17:04

  nodejs抓取动态网页(用nodejs配置代理服务器,我们需要借助两个npm包,一个)

  题图 From Geek Time From Clm

  前端开发人员在工作中经常会遇到跨域问题。一般来说,我们主要使用以下方法来解决跨域问题:

  1、jsonp

  2、cors

  3、配置代理服务器。

  jsonp 不是很灵活。它只能发送 get 请求,但不能发送 psot 请求。虽然cors可以支持多种请求格式,但是如果请求携带cookies,需要分别配置服务端和客户端,也很麻烦。

  与前两者相比,使用代理服务器解决跨域问题要简单得多。

  由于同源策略,浏览器在不同域名之间发送ajax请求,响应数据不会被浏览器加载。服务器到服务器的请求不受同源策略的限制。

  下图是代理服务器的原理:

  代理服务器只起中继作用。配置代理服务器的方式有很多种,比如使用apache、nginx、tomcat等,今天给大家介绍一下用nodejs配置代理服务器,用nodejs配置代理服务器。我们需要用到两个npm包,一个是web开发框架express,一个是express中间件http-proxy-middleware。

  第一步用express搭建两台服务器,一台端口号为3000的静态资源服务器和一台端口号为5000的接口服务器。静态资源服务器代码如下:

  var express = require(express);var app = express();app.use(express.static(./public));app.listen(3000);

  并在public文件夹下创建一个.html,在页面中使用jquery,并使用jquery发送ajax向接口服务器发送测试请求。

  a.html代码如下:

  然后搭建一个接口服务器,接口服务器的端口号为5000,代码如下:

  看代码,我们设计了三个接口,都是get请求,只是url不同。

  此时启动静态资源服务器和接口服务器,然后访问静态资源服务器下的a.html。结果如下:

  如图所示,出现跨域。此时,http-proxy-middleware中间件安装在静态资源服务器中,并集成到静态资源服务器中。

  代码显示如下:

  此时重启静态资源服务器,在a.html页面中稍微更改发送ajax的地址,如图:

  观察代码:我们的代码原来是直接请求5000端口服务器的数据,现在改成相对路径。与当前网页所在的服务器相比,当前网页所在的静态服务器端口为3000。

  当我们访问 ::3000/a.html 时,结果如下:

  看看ajax请求的地址是怎么拼接的:

  结论:相对路径是自动连接的。

  查看请求的结果,是成功的:

  跨域成功,当然这个不严谨,浏览器不参与跨域,但是页面中ajax请求的地址还是3000端口的服务,但是3000端口的服务接收到请求并转发给5000端口服务,5000端口服务结果原封不动返回给浏览器。

  回看上面的代码,我们只是在静态资源服务器中应用了 http-proxy-middleware 中间件。这个中间件的使用非常简单,可以分为以下几个步骤:

  1、安装并导入到项目中。

  2、通过 app.use 挂载中间件。这里需要注意的是,在挂载这个中间件的时候,app.use需要设置一个pre-route来和项目的原创路由区分开来。

  调用该中间件时,需要设置几个常用参数:

  1、target,指的是目标网站,或者代理的网站。

  2、changeOrigin 是否改变主机。默认为 false,不被覆盖。

  3、pathRewrite 路径重写,这个特性取决于需求。

  简单配置:

  如果这样配置,当在a.html中发送请求时,写:

  这个请求会被静态资源服务器翻译成:

  :5000/api/a

  也就是说,如果没有设置pathRewrite,页面中的请求地址会原封不动地追加到目的服务器地址上。

  而如果真正的接口地址是这样的:

  :5000/b

  如何配置代理服务器?

  此时在页面中发送请求:

  此时根据代理服务的重写规则,最终的请求地址为:

  :5000/b

  以上就是pathRewrite的作用。

  然后看changeOrigin的作用。当我们将 changeOrigin 设置为 true 时,我们在接口服务器上打印 req.headers 以查看结果是什么:

  仔细观察host是localhost:5000,把changeOrigin改成false?再次打印 req.headers :

  此时检查主机是否为localhost:3000,

  changeOrigin 是是否重写请求头中的主机。代理服务器会在请求头中添加对应的Host头,然后目标服务器可以根据这个头来区分要访问的站点。如果你在本地80端口设置一个apache服务器,则服务器配备两个虚拟站点,设置代理后changeOrigin为true。至此,就可以正确访问虚拟主机下的文档内容了。否则访问 ab 站点就相当于访问 localhost。当然,如果你的服务器没有配置虚拟主机,你可以省略这个参数,就像上面演示的代码一样,你可以完全省略这个参数。因为接口服务器没有设置虚拟主机。

  以上就是用nodejs搭建代理服务器的知识。这个 http-proxy-middleware 中间件被广泛使用。这个中间件内置在 vue-cli 或 create-react-app 生成的项目中。配置规则基本和上面一样,有什么问题可以留言。

  每天进步一点点,大家互相鼓励,虽然是假期,但也不能放松。

  代码地址

0 个评论

要回复文章请先登录注册


官方客服QQ群

微信人工客服

QQ人工客服


线