2017-04-12 3 views
0

Ich habe eine Elektronen-App und darin schreibe ich in eine Datei.NodeJS - Schreiben in Datei manchmal endet

if(fs.existsSync(envFilepath)) { 
    envFile = fs.createWriteStream(envFilepath) 

    var envs = document.getElementById("envs").value.split(",") 
    envs.forEach(function(env) { 
     if(env && env.localeCompare(" ") !== 0) { 
      env = env.trim() 
      envFile.write(env + '\n') 
     } 
    }) 

    envFile.end() 

    envFile.on('finish', function syncConfigs() { 
     //perform additional tasks 
    }) 
} 

Manchmal ist das Array envs hat Elemente, und es wird schreiben. Für diese Momente wird end() aufgerufen und finish Ereignis wird gefangen und ich gleite reibungslos. Manchmal kann envs leer sein und ich schreibe nicht in die Datei. NodeJS scheint zu hängen, weil ich kein write() aufgerufen habe und das finish Ereignis nie aufgerufen wird.

Warum passiert das? Gibt es einen Workaround für diese Situation?

+0

Wie ist das, dass Sie eine Mischung aus node.js 'fs' Code und Browser' DOM' Funktionen wie 'document.getElementById()' im gleichen Code haben? – jfriend00

+0

@ jfriend00 Ich benutze Electron. – akcorp2003

Antwort

2

Wenn Sie fs.createWriteStream() verwenden, sollten Sie auf das Ereignis 'close' nicht das Ereignis 'finish' hören.

1

Sie können Ihr Problem umgehen, indem Sie die Datei einfach nicht öffnen, wenn Sie nichts zu schreiben haben. Und wenn Sie nur alle Ihre Daten zum Schreiben sammeln, ist es sowohl effizienter, alles auf einmal zu schreiben als auch einfacher im Voraus zu wissen, ob Sie tatsächlich etwas zu schreiben haben, so dass Sie die Datei nicht öffnen können, wenn nichts geschrieben werden muss:

if(fs.existsSync(envFilepath)) { 

    function additionalTasks() { 
     // perform additional tasks after data is written 
    } 

    // get data to be written 
    let envs = document.getElementById("envs").value.split(","); 
    let data = envs.map(function(env) { 
     if(env && env.localeCompare(" ") !== 0) { 
      return env.trim() + '\n'; 
     } else { 
      return ""; 
     } 

    }).join(""); 
    // if there is data to be written, write it 
    if (data.length) { 
     fs.writeFile(envFilePath, data, function(err) { 
      if (err) { 
       // deal with errors here 
      } else { 
       additionalTasks(); 
      } 
     }); 
    } else { 
     // there was no file to write so just go right to the additional tasks 
     // but do this asynchronously so it is consistently done asynchronously 
     process.nextTick(additionalTasks); 
    } 
} 
+0

Danke, dass du das gezeigt hast! Ich habe vergessen, die Länge des Arrays, das ich zurückgegeben habe, abzufragen. Aber diese Antwort ist definitiv eine andere Lösung! – akcorp2003

+0

@ akcorp2003 - Ich denke, das ist technisch eine effizientere Lösung, weil es alle Daten zum Schreiben sammelt, einmal testet, wenn es etwas zu schreiben gibt und dann alles auf einmal schreibt. Es wird sogar vermieden, die Datei zu öffnen, wenn nichts zu schreiben ist. Ihr aktueller Ansatz öffnet und schließt die Datei, selbst wenn es nichts zu schreiben gibt und schreibt dann kleine Stücke auf einmal aus, wenn etwas zu schreiben ist. – jfriend00