2015-03-29 21 views
5

başarısız benim kodudur:node.js dosya yazma Burada rastgele

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' 

fonksiyonu (aCallbackInLoop) bir web hizmeti talebi için bir geri arama geçerli:

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'); 
       } 
      }); 
     }); 
    } 

rastgele hatalar olsun , dataArray içindeki veri parçalarını döndürür. Bir döngüde birden çok web hizmeti isteği gerçekleştiriliyor, bu nedenle bu geri arama belki de paralel olarak çağrılıyor. Bazı dosya kilitleme sorunu olduğundan şüphe duyuyorum, ancak nasıl çözeceğimi bilmiyorum.

PS:

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 
    }); 
} 

cevap

2

appendFile eşzamanlı sürümünü kullanmayı deneyin: Kod yazma akışı denedikten sonra: Ben

Düzenleme (I dataArray tüm öğeleri giriş ediyorum) bir veri sorunu değil emin yaptık - https://nodejs.org/api/fs.html#fs_fs_appendfilesync_filename_data_options

+0

gibi finish olayla bir işlev kayıt olabilirsiniz, ama yine de olsun umuyorum Çalışmanın async yolu. Değilse, bu cevabı çözüm olarak işaretleyeceğim. – SlowAndSteady

+1

Eşzamanlı bir sürüm kullanmak, bir node.js sunucusuna gitmenin doğru yolu değildir. – jfriend00

+0

@ jfriend00 - Doğru, ama yine aynı dosyaya verilen bağlam bağlamında, senkronizasyon en iyi yaklaşımdır. OP'nin yeniden tasarlanması gerekebilir. – manojlds

6

Gözlemlediğiniz gibi, önceki appendFile çağrıları, önceki appendFile çağrıları nedeniyle devam edemiyor. Bu durumda, bir write stream oluşturmak daha iyi olurdu.

var wstream = fs.createWriteStream(fileName); 

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

wstream.end(); 

tüm veriler yazıldığında bilmek istiyorsanız, o zaman bu sorunu çözer bu

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(); 
+0

Bunun doğru yol olduğunu görüyorum, ancak yine de hatayı alıyorum. AppendFileSync kullanırsam - o zaman her şey çalışır. Ama senkron versiyonu kullanmak istemiyorum. Hala ne yapıyorum yanlış yapıyorum! – SlowAndSteady

+0

@SlowAndSteady Denediğiniz gerçek kodu gösterebilir misiniz? – thefourtheye

+0

@SlowAndSteady Neden her veri için bir akış oluşturuyorsunuz? Gösterdiğim gibi değiştir (daha sonra sadece bir kez oluştur) ve dene. – thefourtheye