2013-05-10 15 views
6

Po prostu próbuję kod na NodeJS, jestem nowy w NodeJS. Mam napisać następujący blok kodu.Podanie błędu kodowania w nodeJS

var fs = require('fs'), 
    os = require('os'); 

var filename = 'Server.ini'; 
var serverData = os.hostname() + "\n" + os.platform() + "\n" + os.type() + "\n"; 

fs.existsSync(filename, function(exists) { 
    if(exists) { 
     console.log("1. " + filename + " file found. Server needs to be updated.") 

     fs.unlinkSync(filename, function(error) { 
      if(error) throw error; 
      console.log("2. " + filename + " is been unlinked from server."); 
     }); 

    } else { 
     console.log("1. " + filename + " not found."); 
     console.log("2. Server needs to be configured."); 
    } 
}); 

fs.openSync(filename, "w+", function(error) { 
    if(error) throw error; 
    console.log("3. " + filename + " file is been locked."); 
}); 

fs.writeFileSync(filename, serverData, function(error) { 
    if(error) throw error; 
    console.log("4. " + filename + " is now updated."); 

    fs.readFileSync(filename, 'utf-8', function(error, data) { 
     if(error) throw error; 

     console.log("5. Reading " + filename + " file"); 
     console.log("6. " + filename + " contents are below\n"); 
     console.log(data); 
     console.log("-------THE END OF FILE-------"); 
    }); 
}); 

Mam edytować kod i dodaje synchronizację ale teraz jej daje mi następujący błąd:

D:\NodeJS\fs>node eg5.js 

buffer.js:382 
     throw new Error('Unknown encoding'); 
      ^
Error: Unknown encoding 
    at Buffer.write (buffer.js:382:13) 
    at new Buffer (buffer.js:261:26) 
    at Object.fs.writeFileSync (fs.js:758:12) 
    at Object.<anonymous> (D:\NodeJS\fs\eg5.js:28:4) 
    at Module._compile (module.js:449:26) 
    at Object.Module._extensions..js (module.js:467:10) 
    at Module.load (module.js:356:32) 
    at Function.Module._load (module.js:312:12) 
    at Module.runMain (module.js:492:10) 
    at process.startup.processNextTick.process._tickCallback (node.js:244:9) 

D:\NodeJS\fs> 

Czy jest coś złego w moim kodu dotyczące utf8!

Odpowiedz

7

readFileSync nie oddzwoni. Chyba chcesz zamiast tego użyć readFile.

Masz ten sam problem dla writeFileSync. Te wywołania zwrotne wywoływane przy zakończeniu nie mają sensu podczas synchronicznego używania funkcji IO. Lepiej używać funkcji asynchronicznych (bez "Sync"), zwracaj uwagę na to, że przyjmują różne argumenty.

Dokumentacja zawsze wspomina o "utf8", a nie "utf-8", nie wiem, czy ta ostatnia jest obsługiwana.

+0

Co ważniejsze, writeFileSync nie bierze zwrotnego. Jednak wymaga kodowania. – Brandon

+0

Tak, "utf-8" wygląda na wspierany: https://github.com/joyent/node/blob/5a5a98d0d8281f6901b7e9dac285d59ab3e39b95/lib/buffer.js#L126 – dule

3

Według node.js dokumentacji API, writeFileSync trwa 3 argumenty:

  1. Infomacje napisać do
  2. dane umieścić w pliku
  3. opcjonalne opcje obiekt zawierający, z których jeden jest kodowanie.

Nigdzie nie określa połączenia zwrotnego. Tylko wersja asynchroniczna przyjmuje wywołanie zwrotne.

http://www.nodejs.org/api/fs.html#fs_fs_writefilesync_filename_data_options

Spróbuj zamiast swojego bloku writeFileSync:

fs.writeFileSync(filename, serverData, { encoding: 'utf8'}); 
console.log("4. " + filename + " is now updated."); 

var contents = fs.readFileSync(filename, 'utf8'); 
console.log("5. Reading " + filename + " file"); 
console.log("6. " + filename + " contents are below\n"); 
console.log(contents); 
console.log("-------THE END OF FILE-------");