Node.js文件写入循环失败

时间:2015-03-29 04:40:47

标签: javascript node.js

这是我的代码:

function aCallbackInLoop(dataArray) {
        dataArray.forEach(function (item, index) {

            fs.appendFile(fileName, JSON.stringify(item) + "\r\n", function (err) {
                if (err) {
                    console.log('Error writing data ' + err);
                } else {
                    console.log('Data written');
                }
            });
        });
    }

我收到随机错误:

Data written
Data written
.
.
Error writing data Error: UNKNOWN, open 'output/mydata.json'
Error writing data Error: UNKNOWN, open 'output/mydata.json'
.
.
Data written
Error writing data Error: UNKNOWN, open 'output/mydata.json'

函数(aCallbackInLoop)是Web服务请求的回调,它返回dataArray中的数据块。在循环中正在进行多个Web服务请求,因此可能并行调用此回调。我怀疑这是一些文件锁定问题,但我不确定如何解决。

PS:我确定这不是数据问题(我正在记录dataArray中的所有项目)

编辑:尝试写入流后的代码:

function writeDataToFile(fileName, data) {
    try {
        var wStream = fs.createWriteStream(fileName);
        wStream.write(JSON.stringify(data) + "\r\n");
        wStream.end();
    } catch (err) {
        console.log(err.message);
    }
}

function aCallbackInLoop(dataArray){
    dataArray.forEach(function(item, index){
        writeDataToFile(filename, item);   //filename is global var
    });
}

2 个答案:

答案 0 :(得分:7)

正如您所观察到的,由于之前的appendFile次呼叫,多次appendFile次呼叫无法继续。在这种特殊情况下,最好创建一个write stream

var wstream = fs.createWriteStream(fileName);

dataArray.forEach(function (item) {
    wstream.write(JSON.stringify(item + "\r\n");
});

wstream.end();

如果您想知道何时写入所有数据,那么您可以使用finish事件注册一个函数,如下所示

var wstream = fs.createWriteStream(fileName);

wstream.on("finish", function() {
    // Writing to the file is actually complete.
});

dataArray.forEach(function (item) {
    wstream.write(JSON.stringify(item + "\r\n");
});

wstream.end();

答案 1 :(得分:2)