node构建自己的API服务器系列三:代理服务

原创 Dean 程序相关,系列文章 二维码阅读
2018-10-07 20:55

在上一节中我们提到了通过代理服务的方式我们可以解决一些跨域问题,那么这一节主要就讲通过node我们如何实现一个简单的代理服务。

代理服务,顾名思义就是利用一个中间方去帮我们访问我们要访问的网址并返回结果,比如我们想访问http://www.deanhan.cn/,但是这个网址有一些限制,这个时候我们可以构建一个代理服务,我们向代理服务发起请求,传递想要访问的网址,代理服务在接受到网址之后,去请求我们想要访问的网址,在得到响应之后将得到的响应再返回给我们,在这个过程中,我们可以伪造一些参数,比如userAgent,Referer。

在编写代理服务之前,我们需要先了解一下node中的流。

什么是流?

流是一种抽象的接口,是基于事件的API,用于管理和处理数据,node中很多对象都对它进行了实现。所有流的对象都是EventEmitter的实例,都实现了EventEmitter的接口。也就是流具有事件的能力,可以通过发射事件来反馈流的状态。这样我们就可以注册监听流的事件,来达到我们的目的。也就是我们订阅了流的事件,这个事件触发时,流会通知我,然后我们就可以做相应的操作了。

流的分类

1、Readable Stream:可读数据流

2、Writeable Stream:可写数据流

3、Duplex Stream :双向数据流,可以同时读和写

4、Transform Stream: 转换数据流,可读可写,同时可以转换(处理)数据

在流中有一个很重要的概念,那就是管道,其实管道(pipe)的概念很早就存在于Unix系统中,你可以通过这篇文章了解更多,流允许你将其他对象或程序连接在一起,例如:readStream.pipe(writeStream)。在express中req, res对象均实现了流,而我们昨天提到的request库也实现了流,借助流我们就可以很轻松的实现代理服务了。

首先,还是老规矩,规划路由,这个路由相对简单:

/proxy/:url 代理访问传递的url,此处也可以传递一些需要自定义的header,但是后端需处理

然后在routes目录下新建处理文件proxy.js,编写代码:

const express = require('express');
const request = require('request');
const router = express.Router();

router.get('/:url', function(req, res, next) {
	const { url } = req.params;
	if (url) {
		req
			.pipe(
				request({
					url: decodeURIComponent(url),
					// 这个地方可以自定义一些header头
					headers: {
						Referer: ''
					}
				})
			)
			.pipe(res);
	}
});

module.exports = router;

最后在入口文件app.js中建立路由映射关系

app.use('/proxy', proxyHandler);

运行

node app.js

访问网址:http://127.0.0.1:1314/proxy/http%3A%2F%2Fwww.deanhan.cn%2F(传递的网址需要url编码后端需要url解码),我们就通过代理服务的方式访问了博客。

最后附上运行截图和源码:

你可以点击这里下载示例代码。

系列文章导航:

第一节:node构建自己的API服务器系列一:日志服务

第二节:node构建自己的API服务器系列二:IP解析服务

第四节:node构建自己的API服务器系列四:快递单识别服务

第五节:node构建自己的API服务器系列五:邮件发送服务

本文地址:https://www.deanhan.cn/node-api-server-series-3.html
版权声明:本文为原创文章,版权归 Dean 所有,欢迎分享本文,转载请保留出处!
  • 支付宝二维码 支付宝
  • 微信二维码 微信