node.js下FTP客户端实现思路

在开发流程中,最终的部署阶段是需要将文件上传到生产服务器的相应目录下,这是最常用的手段是使用FTP协议来传输文件,这个操作已经有许多框架和工具将其实现。然而,由于历史原因和具体的服务器配置导致很多现行的开源库并不支持这种开发场景。所以,这就需要根据实际需求,使用node.js的网络开发组件,自己实现一遍。

背景

近期,笔者正在进行公司前端的自动化开发流程转型的工作。该工作的最后一个环节需要将项目文件部署到服务器的对应文件上,使用的途径是FTP。然而,FTP的数据传输被设定为。

这直接导致,公开的一些开源工具不能直接支持,因为大多数基于node.js的FTP客户端都是,比如引用比较多的。

由此,需要解决该问题,就要自己动手,打通这条道路。

方案初探

1.使用

如果在node.js环境下没有合适的开源库来达成这个需求,笔者第一想到的是使用原生的ftp来实现,主要有以下两个原因:第一,原生的ftp默认是使用ftp来进行连接;第二,在各种开发的系统环境中可以方便的编写统一的执行脚本,控制ftp上传(因为win下也有git bash是满足执行sh脚本的环境的)。

后续:

笔者尝试了在Mac和Linux环境中成功的编写了脚本,并用来进行命令执行。得到了比较好的效果,但在win10系统下,却一直卡在的欢迎信息之后,不接受用户名和密码的输入,并且这个问题在可预见的时间内很可能得不到解决。所以在此种情形下,这种尝试并不适合所有开发平台的运行。因此思路仍然回到统一的node.js环境下解决。

2.使用自动部署

因为开发人员每个人的开发环境都不同,所导致的构建环境差异,其实是可以用去解决,DevOps的思路就是将机械化和比较固定的流程在同一构建环境中进行脚本化的运作,以消除开发环境差异并实现自动部署。

但是实际情况是,Gitlab缺少可运行的Runner,此时再去准备对应环境,也会有效率的浪费。所以,这种思路也放弃了。

没有CI环境

3.使用自己开发的

到了最后,不得不自己来实现一套基于node.js的FTP客户端,来完成开发自动化的需求。

基本原理

主动模式的FTP是这样的:客户端从一个任意的非特权端口N(N>=1024)连接到FTP服务器的命令端口(21)。然后客户端开始监听端口N+1,并发送FTP命令“PORT IP,N+1”到FTP服务器。接着服务器会从它自己的数据端口(20)连接到客户端指定的数据端口(N+1),从而实现数据的传输。

原理如下图所示:

FTP主动模式

概括一下来讲,有两点是需要解决的:第一,从本地端口链接服务器的命令端口21;第二,监听给定端口的数据传输变动。

实现思路

首先FTP是基于TCP的服务,在node.js里面,可以使用模块来实现TCP的链接。

于是,笔者做了如下尝试:

以上尝试中获得了代码的欢迎信息,证明与FTP服务器的数据链接成功。接下来就可以发送和信息验证登录,具体的方法是用发送命令。

当上述代码中,返回时,到此,从命令通道建立,到主动模式设置已经完成,接下来就需要建立一个数据通道来进行数据传输了。

命令通道发出下载命令后,本地的数据监听服务获取到由FTP服务器发送的数据,会返回到的回调中,如果一切正常,看起来就会像这样:

至此,FTP主动模式的的数据通道就完整打通了。接下来就是本地操作,将转换为模块可操作的数据类型,并写入到本地文件即可。

对于上传,就是下载的逆过程,先用读取本地文件,转换为,然后使用,进行上传操作。

TODOs

x

完善调用逻辑,匹配现有的开发流程

x

封装命令,使其支持更多灵活的调用

x

形成npm包,方便开发

  • 发表于:
  • 原文链接https://kuaibao.qq.com/s/20190222G10GAI00?refer=cp_1026
  • 腾讯「云+社区」是腾讯内容开放平台帐号(企鹅号)传播渠道之一,根据《腾讯内容开放平台服务协议》转载发布内容。
  • 如有侵权,请联系 yunjia_community@tencent.com 删除。

同媒体快讯

扫码关注云+社区

领取腾讯云代金券