【问题标题】:Why append rather than write when using knox / node.js to grab file from Amazon s3为什么在使用 knox / node.js 从 Amazon s3 抓取文件时附加而不是写入
【发布时间】:2012-02-04 16:59:15
【问题描述】:

我正在尝试使用 node.js 的 knox 模块来管理 Amazon S3 存储桶中的一些小文件。一切都可以独立运行:我可以上传文件、下载文件等。但是,我希望能够定期下载文件。当我修改代码以按时间间隔运行时,我将下载的文件附加到前一个实例而不是覆盖。

我不确定我是否在文件写入代码或 knox 处理代码中犯了错误。我尝试了几种不同的写入方法(writeFile、writeStream 等),并且查看了 knox 源代码。对我来说没有什么明显的问题。这是我正在使用的代码:

knox = require('knox');
fs = require('fs');
var downFile = DOWNFILE;
var downTxt = '';
var timer = INTERVAL;
var path = S3PATH + downFile;
setInterval(function() 
{
        var s3client = knox.createClient(
        {
                key: '********************',
                secret: '**********************************',
                bucket: '********'
        });
        s3client.get(path).on('response', function(response)
        {
                response.setEncoding('ascii');
                response.on('data', function(chunk)
                {
                        downTxt += chunk;
                });
                response.on('end', function()
                {
                        fs.writeFileSync(downFile, downTxt, 'ascii');
                });
        }).end();
},
timer);

【问题讨论】:

    标签: node.js amazon-s3 amazon knox-amazon-s3-client


    【解决方案1】:

    问题在于您放置var downTxt = '';。那是您将 downTxt 设置为空白的唯一地方,因此每次检索更多数据时,都会将其添加到您在上一个请求中获得的数据中,因为您永远不会清除上一个请求中的数据。最简单的解决方法是将该行移至 setEncoding 行之前。

    但是,您处理数据的方式过于复杂。试试这样的东西。您不需要每次都重新创建客户端,如果您正在下载非文本文件,设置编码只会破坏事情,并且不会对文本文件产生影响。接下来,您不应该手动收集数据,您可以在收到数据后立即开始将其写入文件。最后,由于 request 是一个标准流,你不需要监控 'data' 事件,因为你可以使用pipe

    var knox = require('knox'),
        fs = require('fs'),
        downFile = DOWNFILE,
        timer = INTERVAL,
        path = S3PATH + downFile,
        s3client = knox.createClient({
            key: '********************',
            secret: '**********************************',
            bucket: '********'
        });
    
    (function downloadFile() {
      var str = fs.createWriteStream(downFile);
      s3client.get(path).pipe(str);
      str.on('close', function() {
        setTimeout(downloadFile, timer);
      });
    })();
    

    【讨论】:

    • 啊,忘记重置 downTxt 是我知道我必须在某个地方犯的那种明显的愚蠢错误。也感谢其他建议。我没怎么玩过管道,但这显然更优雅。
    猜你喜欢
    • 2014-10-05
    • 2014-04-01
    • 1970-01-01
    • 2011-10-10
    • 2019-09-16
    • 1970-01-01
    • 1970-01-01
    • 2021-12-28
    • 2020-01-27
    相关资源
    最近更新 更多