如何使用节点js转换流作为读取流?

内容来源于 Stack Overflow,并遵循CC BY-SA 3.0许可协议进行翻译与使用

  • 回答 (1)
  • 关注 (0)
  • 查看 (141)

我尝试使用node.js中的AWS-SDK下载,修改并重新上传文件到Amazon S3。我对节点是新手,并且在一些Google搜索之后,我选择尝试使用流来实现此逻辑。我通过继承stream.Transform和提供一个transform函数创建了一个自定义转换流。我目前的实施是:

// Download and modify file.
var outputStream = s3.getObject(getParams).
    createReadStream().
    pipe(transformStream);

// Upload modified file by passing outputStream as body to s3.putObject.
// s3.putObjectWrapper is a promise wrapper for the api function putObject.
s3.putObjectWrapper({body: outputStream, ...}).
    then((data) => {
        logger.debug("Put Success: ", {data: data});
    }).
    catch((err) => {
        logger.error("Put Error: ", {error: err});
    });

这会产生以下错误输出:

error: Put Error: message=Cannot determine length of [object Object], objectMode=false, highWaterMark=16384, head=null, tail=null, length=0, length=0, pipes=null, pipesCount=0, flowing=null, ended=false, endEmitted=false, reading=false, sync=false, needReadable=true, emittedReadable=false, readableListening=false, resumeScheduled=false, defaultEncoding=utf8, ranOut=false, awaitDrain=0, readingMore=false, decoder=null, encoding=null, readable=true, domain=null, end=function

怎么办?

提问于
用户回答回答于

使用s3.upload:

const params = { Bucket: 'bucket', Key: 'Filename', Body: stream };
s3.upload(params, (err, data) => {
  console.log(err, data);
});

使用s3.putObject

// This will work if you know the length beforehand
outputStream.length = getStreamLength(); 

s3.putObjectWrapper({ body: outputStream })
const writeStream = fs.createWriteStream('/tmp/testing');

var outputStream = s3.getObject(getParams)
    .createReadStream().
    .pipe(transformStream)
    .pipe(writeStream)


 writeStream.on('close', () => {

    const readStream = fs.createReadStream('/tmp/testing');

    s3.putObjectWrapper({
      body: readStream
    })
    .then(data => {
      logger.debug("Put Success: ", { data: data });
    })
    .catch(err => {
      logger.error("Put Error: ", { error: err });
    });
});

热门问答

Linux系统加了弹性网卡却不能从外部访问?

推荐
回答来自于问答智囊团成员:Htroy 专栏:https://cloud.tencent.com/developer/column/89781 为了给云服务器增加一个外网IP,实现单主机多 IP 部署,或者在一个CVM上接入到多个私有网络中,我们可以通过绑定弹性网卡的方式实现。...... 展开详请

腾讯云上如何自建DNS?

济南庆典wtk软件工程师
推荐
回答来自于问答智囊团成员:22 专栏:https://cloud.tencent.com/developer/column/89781 安装配置: 1. #yum install -y bind bind-chroot bind-utils 2.主配置文件/...... 展开详请

TDSQL 账户加固会影响到视图无法访问?

酒当歌趁年轻,多折腾
推荐
回答来自于问答智囊团成员:vkyzhao 专栏:https://cloud.tencent.com/developer/column/86410 背景 用户反馈实例视图无法访问,与用户沟通后,了解到近期安全变更将部分用户绑定的ip从%转换客户端ip地址,发生故障后,用户紧急进行了...... 展开详请

MySQL 8.0统计信息不准确?

推荐
回答来自于问答智囊团成员:王文安@DBA 专栏:https://cloud.tencent.com/developer/user/7566357 原因剖析 实际上是MySQL 8.0为了提高information_schema的查询效率,将表和统计信息放入内部的统计信息缓存起来,...... 展开详请

腾讯云 CVM 如何在控制台进入 linux 单用户模式?

铁血之鹰腾讯云 11338 號
推荐
回答来自于问答智囊团成员:赵智勇 专栏:https://cloud.tencent.com/developer/user/4476879 腾讯云控制台进入linux云服务器的单用户模式的步骤 1. 控制台选择VNC方式登陆服务器 2.下发Ctrl+Alt+Delete快捷键触发...... 展开详请

腾讯云虚拟机内存性能不符合预期?

推荐
回答来自于问答智囊团成员:curuwang 专栏:https://cloud.tencent.com/developer/user/2177340 先说结论:测试工具和环境差异造成,实际性能并无差异 问题推导 理论上是否可能存在这么大的差异? 现代CPU的内存管理功能中有硬件辅助...... 展开详请

所属标签

扫码关注云+社区

领取腾讯云代金券