nodejs从ftp获取文件内容(非文件管道)

OpenClaw+CloudBase实战:零代码对话式开发全栈Web应用 在软件工程领域,大语言模型(LLM)正推动开发模式从传统编码向自然语言交互演进。其核心原理是利用LLM强大的意图理解和代码生成能力,将人类语言指令转化为可执行的开发操作。这种对话式开发的技术价值在于显著降低开发门槛,将开发者的认知负荷从语法细节转移到业务逻辑设计上。它特别适用于快速原型构建、自动化脚本编写和标准化应用开发等场景。本文以构建一个任务管理Web应用为例,通过开源智能体框架OpenClaw调用工具链,结合腾讯云云开发(CloudBase)的全托管后端服务,全程通过自然语言对话完成云函数编写、数据库 阅读详情

起初的源码:

router.post("/getfile", (req, res) => {
	let c = new Client();
	let params = req.query;
	let filePath = params.filepath;

 	c.on('ready', function () {
	    c.get(filePath, function (err, stream) {
			if (err) {
				res.end(JSON.stringify({
					code: 1,
					message: err,
	          		data: ''
	        	}));
	        	return '';
	      	}

	      	stream.once('close', function () {
	        	c.end();
	      	});
	      	stream.pipe(res);
	    });
	});
  	c.connect(connectKey)
});

问题说明:

打log后发现进入路由的时间很快,并且执行速度也很快,毫秒级别的运行时间,但是接口的返回显得很慢,所以是stream.pipe(res);的相关问题。

问题分析

我打算分析pipe相关的源码,但是网上没找到资源,只找到nodejs的api中有对pipe和流的其他用法,所以最后的解决方法用的是流的读取。我把它放在这。

ftp在ready后获取err和stream两个参数,其中stream是流的含义,所以在官方文档中找到流的文件读写方法,并通过eventEmitter事件触发各类操作,列出如下:

  • close —— writeable
    流及其任何底层资源(例如文件描述符)已关闭时,则会触发 ‘close’ 事件
  • error —— writeable
    如果在写入或管道数据时发生错误,则会触发 ‘error’ 事件
  • finish —— writeable
    在调用stream.end()方法之后,并且所有数据都已刷新到底层系统,则触发 ‘finish’ 事件
  • pipe —— writeable
    当在可读流上调用 stream.pipe() 方法将此可写流添加到其目标集时,则触发 ‘pipe’ 事件
    ···可写流就先写这么多,暂时用不到

既然是管道的方法,我认为是服务器和本机没有缓存的原因,导致ftp的传输是字节流,所以响应速度很慢,但是在多次实践中发现读取时间一直是稳定在10s左右,所以排除字节流的读取方法。

另一种猜想也和合理的是管道运输需要一个目的缓存,但是直接使用pipe方法的res没有文件流的接收方,数据就会堵在发送方,直至管道结束。

解决方法(另一种读取方案)

我当时的解决方法是使用流的读取事件获取chunk,最后返回给res。源码如下

router.post("/getfile", (req, res) => {
	let c = new Client();
	let params = req.query;
	let filePath = params.filepath;

 	c.on('ready', function () {
	    c.get(filePath, function (err, stream) {
			if (err) {
				res.end(JSON.stringify({
					code: 1,
					message: err,
	          		data: ''
	        	}));
	        	return '';
	      	}
	      	let data = '',
	          	chunk = '';
	      	stream.on('close', function () {
	        	c.end();
	      	});
	      	stream.on('readable', function () {
	       		while(null != (chunk = stream.read())) {
	          		data += chunk;
	        	}
	        	setTimeout(() => {
	          		res.end(JSON.stringify({
	            		code: 0,
	            		message: '',
	            		data: data
	          		}));
	        	});
	      	});
	    });
	});
  	c.connect(connectKey)
});

根据官方文档描述:

每次调用 readable.read() 都会返回一个数据块或 null。 块不是串联的。 需要 while 循环来消费当前缓冲区中的所有数据。 当读取大文件时,.read() 可能会返回 null,到目前为止已经消费了所有缓冲的内容,但是还有更多的数据尚未缓冲。 在这种情况下,当缓冲区中有更多数据时,将触发新的 ‘readable’ 事件。 最后,当没有更多数据时,则将触发 ‘end’ 事件。

所以在没有可传输文件时,流的readable会触发一个end信号;但在实际应用中,end并没有触发,目前也不清楚原理,而且close不是立即触发的,也是10s后才触发。不过这种写法可以很快返回res。

JavaScript实现FTP文件下载(附完整源码) 阅读详情

相关推荐

使用 ftp-srv 在 nodejs 创建FTP服务器,简单版

使用node.js 创建一个自定义的FTP服务器, 这里只是实现极少一部分! 主要是演示 ftp-srv 的文件系统(FileSystem)的部分用法!

nodejs连接ftp上传下载

依赖 //ftp 模块是目前找到的还不错的,对于ftp的基本功能都支持 npm install ftp 连接ftp const ftp = require('ftp');//连接FTP const client = new ftp(); client.on('ready',()=>{ console.log('ftp client is ready'); }); client.connect({ host : '***.***.***.***', port : '****',

nansen0324的博客 4917

node-red-contrib-advanced-ftp:Node-RED节点和高级FTP服务器

节点红色贡献高级FTP 和高级FTP客户端和记录器的Node-RED节点。 node-red-contrib-advanced-ftp是的修改版,增加了多个命令,并且可以在运行时修改参数 先决条件 node-red-contrib-advanced-ftp要求安装 。 安装 在您的Node-RED安装的根目录中运行以下命令 npm install node-red-contrib-advanced-ftp 重新启动您的Node-RED实例,该ftp节点出现在选项板中并可以使用。 或使用Menu - Manage palette选项并搜索node-red-contrib-advanced-ftp 。 例子 FTP客户端: [{"id":"f3b0d791.c94aa8","type":"inject","z":"e40b45d4.16e328","name":"Send Operat

【亲测免费】 jsFTP: 基于Node.js的FTP客户端库

jsFTP是一个基于Node.js的轻量级FTP客户端库,允许你轻松地与FTP服务器进行交互。它提供了丰富的API,使得在Node.js应用中实现FTP功能变得更加简单。 ## 能用来做什么? 你可以使用jsFTP库在你的Node.js应用程序中执行以下操作: * 连接到FTP服务器 * 列出目录中的文件和子目录 * 上传、下载文件 * 创建、删除目录 * 更改当前工作目录 * 断开与FTP...

gitblog_00039的博客 2411

IEEE Transactions on Industrial Informatics(TII) 投稿须知- Initial Submission

请注意,您可以在作者中心查看稿件的当前状态,如:在EIC办公室、分配给AE、AE邀请审稿人、AE指定审稿人、正在审稿、等待AE决定、等待EIC决定。为了确保公正的评审过程,我们要求在稿件中没有任何作者的身份(不包括作者的姓名、传记、隶属关系、求职信、签署的版权表格、识别脚注、致谢等)。如果你的手稿有很大一部分已经在会议上发表过,论文必须隐藏所有作者的身份,这样会议论文就可以被引用,就好像它是由不同的作者写的一样。请注意,通常你的技术成就是根据被引用的次数来评估的,而不是根据发表的论文数量。

loinleeai的博客 4430

AutoLISP 学习 (一)

AutoLISP基本语法结构、语法 以括号组成表达式,左右括号一定要成对,单、双引号也要成对,例如: (defun c:hello() (princ "\nHello world!") (prin1) ) 表达式格式:(函数名 操作数 操作数 …),例如: (setq p1 (list 0 0)) (setq p2 (list 10 10)) (setq p3 (list 20 20)) ;;; CAD中画直线,经过p1 p2 p3 (command "LINE" p1 p2 p3 ""

m0_54575622的博客 2123

探索Node.js FTP客户端库:`node-ftp`

在开发涉及文件上传和下载的应用时,FTP(File Transfer Protocol)是一种常见且实用的选择。而今天,我们要推荐的开源项目是`node-ftp`,这是一个为Node.js构建的轻量级、高效的FTP客户端库。如果你正在寻找一个易于集成且功能强大的FTP解决方案,那么不妨考虑一下`node-ftp`。 ## 项目简介 [![GitHub](https://img.shields....

gitblog_00021的博客 963

ArcGIS通过已知坐标点转面(通过excel文件,有工具可批量生成面要素)

通过使用ArcGIS中的工具,将坐标点XY数据转换成可视化的点线面矢量数据,更加方便快捷有效的获取对应信息

qq_41046162的博客 3万+

nodejs sftp上传

// deploy.js /** * 部署之前请检查好要部署的路径 * 如有多个环境,自行拓展 */ const gulp = require("gulp") const sftp = require("gulp-sftp-up5") const sftpConfig = { // 此处的key对应着package.json中脚本的 APP_ENV test: { remotePath: "/test", // 部署到服务器的路径 host: "39.106.10.163", // 服

qq_33332184的博客 616

零信任架构实战:“持续验证+动态授权”全流程解析(附策略引擎联动图)

《零信任实战指南:7图拆解核心流程与行业案例》摘要:本文通过7张架构图系统解析零信任五大核心流程:强身份认证、设备检查、动态授权、持续监控和自动降权。对比金融(重数据审计)与制造业(重物理绑定)的落地差异,指出三大常见误区及解决方案。数据显示,零信任可使安全响应提速60%,泄露成本降低45%。文章提供6个月实施路线图,强调零信任是"智能信任"体系,建议企业分阶段改造,优先保护核心系统。附赠金融/制造行业策略模板及甘特图示例。(149字)

sara_han的博客 776

Windows 10下Gpg4win 4.3.1安装与配置全攻略:从下载到邮件加密实战

本文详细介绍了在Windows 10系统下安装和配置Gpg4win 4.3.1的全过程,包括下载、验证、自定义安装以及密钥管理。特别重点讲解了如何通过Kleopatra证书管理器进行密钥创建和管理,以及在Outlook中实现邮件加密的实战操作,帮助用户全面提升数据安全防护能力。

weixin_29271263的博客 301

java printf 版本,java printf与println的区别

JavaScript编码规范1 代码风格 1.1 结构语句 [强制] 不得省略语句结束的分号. [强制] 在if / else / for / do / while语句中,即使只有一行,也不得省略块{...}. 示例: / ...jquery 操作iframe的几种方法总结iframe在复合文档中经常用到,利用jquery操作iframe可以大幅提高效率,这里收集一些基本操作 DOM方法: ...

weixin_36446407的博客 161

YOLOv11涨点改进 | Neck改进篇 | YOLOv11引入 BiFPN双向特征金字塔网络,显著提升了多尺度特征融合效率

本文介绍了基于BiFPN特征融合模块优化的YOLOv11目标检测模型。BiFPN通过双向跨尺度连接和加权特征融合机制,显著提升了多尺度特征融合效率。该方法在COCO数据集上实现了55.1AP的检测精度,同时大幅降低计算成本(减少13-42倍FLOPs)。文章详细解析了BiFPN模块结构、核心代码实现方法,并提供了YOLOv11-BiFPN配置文件的修改指导,为计算机视觉领域提供了一种高效的目标检测解决方案。

Ai缝合怪、助力小伙伴高效发论文 715

渗透测试 ( 0 ) --- XSS、CSRF、文件上传、文件包含、反序列化漏洞

渗透测试 --- http协议、XSS、CSRF、文件上传、文件包含、反序列化漏洞

freeking101的博客 5542

系统安装(kuntaiR522 kvm安装)

鲲泰R522服务器kvm安装rocky

weixin_46396917的博客 1821

提升YOLOv8检测精度的边界框损失函数Focaler-IoU与InnerFocalerIoU的应用与效果

YOLOv8是一种常用的实时目标检测模型,基于CNN(卷积神经网络)结构并结合了一些改进技术以提高检测精度和速度。YOLOv8的核心在于边界框的预测和分类,而准确的边界框预测是提高模型整体性能的关键因素之一。在传统的IoU损失基础上,Focaler-IoU和InnerFocalerIoU进一步聚焦于边界框的边缘区域,通过调整损失权重,更好地关注难以检测的边界框,提高模型的鲁棒性和准确性。# 计算IoU# 计算Focaler-IoU损失在这里,我们定义了。

博客 1340

大数据、机器学习和深度学习类命令行工具

在 OSX 和 LInux 上无需使用鼠标或 GUI ,也可以完成大量的操作。极具人气的面向各类 N X系统的命令行工具目前已经扩展至Python、Go、NodeJS 乃至各类混合型工具当中。即使您并不打算通过命令行来运行整条数据处理管道,这些工具依旧可以带来很大的帮助。 在 OSX 和 LInux 上无需使用鼠标或 GUI ,也可以完成大量的操作。极具人气的面向各类 N X系统的命令行工具目前已...

weixin_34292924的博客 185

SAP B1中文培訓教材_SDK

公司内部培训资料,对开发工具 ,DIAPI, UIAPI,Add-ON有详细解说

Linux命令及使用方法new

本文总结了Linux系统管理与开发环境配置的实用技巧,涵盖了常用命令、工具配置和问题解决方法。主要内容包括:Linux基础操作(文件/目录管理、vim编辑器、权限控制);系统资源监控(du/df命令);文本处理(grep/cut/awk);Ubuntu系统问题排查;开发工具链配置(Anaconda/Virtualenvwrapper/Jupyter);终端增强(cmder/Screen);IDE使用(VSCode/Visual Studio);非root权限软件安装;Windows冷门知识;LaTeX语法;

zhjadsf的博客 3217

WINCC7.3破解文件

WINCC7.3硬件够破解文件,有需要的下载!WINCC7.3硬件够破解文件,有需要的下载!

LinePhone3.2.7(android端最新版本) sip客户端

SIP客户端For android:LinePhone3.2.7(最新版本),官网地址:http://www.linphone.org/

NODE基础(六)

ES6 严格模式 use strict 必须先声明后使用 let 块级作用域 变量当前声明所在的{} ,没有{}就是模块的作用域,相比var不存在变量类型提升 查找机制:就近原则,如果当前{}内有声明,直接使用,没有声明,向上级作用域查找 不能重复声明 const 块级作用域 使用方式: 首先完成初始化,声明并且赋值 不能二次赋值,直接用等号=赋值该对象,用该对象.属性=值,修改对象的属

七日之书 447

Outlook Express 6 (OE6) for Win7/Win8/Win10

英文版 Outlook Express6.0, 兼容Win7/Win10/WinXP,解压就可用。

linux、git、svn学习笔记

linux (c、Javascript、Java、Python) 集成环境 dw/ws eclipse myeclipse 编程语言的学习最好在linux操作系统下 web开发的部署环境 静态页面 动态网站 接口服务 linux作为服务器(网页) 嵌入式操作系统 linux -> 硬件系统 linux内核 android ubuntu 红帽子 … unix 免费开源 linux(...

weixin_45458515的博客 279

HTTP协议

HTTP通信模型 URL HTTP请求和响应 HTTP工作原理

Salute_Lch的博客 334

Android 手机的高级终端 Termux 安装使用、busybox、安卓 手机 web

手机已经 root安装 tsu,这是一个 su 的 Termux 版本,是一个真正的 root 权限,用来在 Termux上替代su,操作不慎可能对手机有安全风险,因为官方封装了,所以安装也很简单:安装 tsu:pkg install tsu -y切换到 root:tsu退出 root:exittsu切换 root 用户时会弹出 root 授权提示,给予其 root 权限即可。在管理员身份下输入 exit 可回到普通用户身份。

freeking101的博客 10万+

[system-design] ByteByteGo_Note Summary

note

No Game No Life 1459

Scoop:Windows开发者的命令行工具箱革命

你是否曾经历过这样的场景:新入职一家公司,面对一台全新的Windows电脑,需要安装Python、Node.js、Docker、Git等数十个开发工具?传统方式要么是逐个下载安装包,要么是编写复杂的脚本——直到你遇到了Scoop。 ## 第一部分:重新定义Windows开发环境管理 ### 从"安装工具"到"环境即代码" 想象一下,你的开发环境配置可以像代码一样被版本控制、被复用、被分享。这

gitblog_00444的博客 539
上一篇: ES6的语法糖
下一篇: Gojs学习笔记
巨蟹贼香
博客等级 码龄9年 76粉丝 43原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值