上传前文件未在node.js中关闭

时间:2016-04-28 16:27:48

标签: javascript node.js file fs

我试图在创建后将文件上传到S3但是文件似乎没有用fs.createWriteStream关闭。因此我不断上传一个0字节的文件。

function createManifest(manfile) {
console.log(['a'].toString(), ['a', 'b'].toString());

    var arrayLength = files.length;
    var lastItem = arrayLength - 1;
    console.log( chalk.blue("The last item value is:",lastItem))
    console.log( chalk.yellow("The arrayLength value is:",arrayLength))
    var logStream = fs.createWriteStream("manny_temp.json", {'flags': 'a'});
// use {'flags': 'a'} to append and {'flags': 'w'} to erase and write a new file
//    logStream.on('open', function(fd) {
logStream.write('{'+ "\r\n");
logStream.write("\"entries\": [" + "\r\n");

    for (var i = 0; i < arrayLength; i++) {

            console.log( chalk.inverse(files[i]))
            console.log( chalk.blue("The i value is:",i))
            if ( i == lastItem) {
                logStream.write("{\"url\":\"s3://mybucket/" +files[i] + "\",\"key\":true}" + "\r\n");
            } else {
                    logStream.write("{\"url\":\"s3://mybucket/" +files[i] + "\",\"key\":true}," + "\r\n");
             }
    }
    logStream.write('    ]' + "\r\n");
    logStream.write('}');
//      }).on('end', function() {
            logStream.end();
            //fs.renameSync(logStream.path, manfile.toString());
            return callback(filepath);
//      logStream.close();
    //fs.renameSync(logStream.path, "manny.json");

  //   });
}

我已经尝试了多种方法来关闭文件,以便下一个函数可以在创建时上传文件,甚至添加一个睡眠,但它似乎总是留下一个悬挂的inode。

使用fs.write似乎只写一行而不是写入数组/流数据中的所有行。

有人有建议吗?

3 个答案:

答案 0 :(得分:2)

在调用回调之前,您需要在close上侦听logStream事件。这就是支持文件描述符已关闭的信号(不再进行写入)。我应该注意,这与监听finish事件不同,因为finish仅表示流已关闭,但不一定是文件描述符已关闭,因此从技术上讲,依赖于你很快就会对文件做些什么。)

替换它:

return callback(filepath);

用这个:

logStream.on('close', function() {
  callback(filepath);
});

通过使用节点生态系统中常见的(err, result)样式回调,可以进一步改进这一点:

logStream.on('close', function() {
  callback(null, filepath);
});
logStream.on('error', function(err) {
  callback(err);
});

这样您就可以捕获打开或写入文件可能导致的任何错误。

我还假设你在某个父作用域中定义了callback

答案 1 :(得分:0)

您的问题在没有基础研究的情况下被问到,但这是尝试使其更易读的代码和可执行文件。希望您能找到以下代码的答案。

如果您的问题仍然相同,请以更好的方式重写您的问题。

var chalk = require('chalk');
var fs = require('fs');

function createManifest(manfile) {
var files = ['/test.json'];
console.log(['a'].toString(), ['a', 'b'].toString());
    var arrayLength = files.length;
    var lastItem = arrayLength - 1;
    console.log( chalk.blue("The last item value is:",lastItem))
    console.log( chalk.yellow("The arrayLength value is:",arrayLength))
    var logStream = fs.createWriteStream("manny_temp.json", {'flags': 'a'});
    logStream.write('{'+ "\r\n");
    logStream.write("\"entries\": [" + "\r\n");

    for (var i = 0; i < arrayLength; i++) {

            console.log( chalk.inverse(files[i]))
            console.log( chalk.blue("The i value is:",i))
            if ( i == lastItem) {
                logStream.write("{\"url\":\"s3://mybucket/" +files[i] + "\",\"key\":true}" + "\r\n");
            } else {
                    logStream.write("{\"url\":\"s3://mybucket/" +files[i] + "\",\"key\":true}," + "\r\n");
             }
    }
    logStream.write('    ]' + "\r\n");
    logStream.write('}'); 
    logStream.end();
    logStream.on('finish', function(){
        fs.renameSync("manny_temp.json", "manny.json"); 
    }); 
};

createManifest();

答案 2 :(得分:-2)

mscdex几乎是正确的。你需要监听'finish'事件,而不是'close'事件,因为它是由可读流发出的,但这是一个可写的流。

您可以将处理程序传递给'end'。见https://nodejs.org/dist/latest-v4.x/docs/api/stream.html#stream_event_finish

logStream.end(function() {
    fs.renameSync("manny_temp.json", "manny.json");
    callback(filepath);
});

我试图编辑mscdex对此效果的回答,但由于某种原因这被拒绝了。

编辑:您需要定义或传入'回调'以及'文件路径'。