web-dev-qa-db-fra.com

Comment capturer aucun fichier pour fs.readFileSync ()?

Dans node.js readFile () montre comment capturer une erreur, mais il n’ya pas de commentaire pour la fonction readFileSync () concernant le traitement des erreurs. En tant que tel, si j'essaie d'utiliser readFileSync () lorsqu'il n'y a pas de fichier, j'obtiens l'erreur Error: ENOENT, no such file or directory.

Comment capturer l'exception levée? Le document n'indique pas quelles exceptions sont levées, donc je ne sais pas quelles exceptions je dois intercepter. Je dois noter que je n'aime pas le style générique des instructions try/catch du type générique "intercepter toutes les exceptions possibles". Dans ce cas, je souhaite intercepter l'exception spécifique qui se produit lorsque le fichier n'existe pas et j'essaie d'exécuter readFileSync.

Veuillez noter que je n'effectue des fonctions de synchronisation qu'au démarrage avant de servir les tentatives de connexion. Par conséquent, les commentaires que je ne devrais pas utiliser à l'aide des fonctions de synchronisation ne sont pas obligatoires :-)

111
Metalskin

Fondamentalement, fs.readFileSync renvoie une erreur lorsqu'un fichier est introuvable. Cette erreur provient du prototype Error et a été lancée à l'aide de throw. Par conséquent, le seul moyen d'attraper est d'utiliser un try / catch bloquer:

var fileContents;
try {
  fileContents = fs.readFileSync('foo.bar');
} catch (err) {
  // Here you get the error when the file was not found,
  // but you also get any other error
}

Malheureusement, vous ne pouvez pas détecter quelle erreur a été générée simplement en regardant sa chaîne de prototypes:

if (err instanceof Error)

est le mieux que vous puissiez faire, et cela sera vrai pour la plupart (sinon toutes) des erreurs. Par conséquent, je vous suggérerais d’utiliser la propriété code et de vérifier sa valeur:

if (err.code === 'ENOENT') {
  console.log('File not found!');
} else {
  throw err;
}

De cette façon, vous ne traitez que cette erreur spécifique et relancez toutes les autres erreurs.

Vous pouvez également accéder à la propriété message de l'erreur pour vérifier le message d'erreur détaillé, qui est dans ce cas:

ENOENT, no such file or directory 'foo.bar'

J'espère que cela t'aides.

177
Golo Roden

Bien que la solution acceptée soit acceptable, j’ai trouvé un bien meilleur moyen de gérer cela. Vous pouvez simplement vérifier si le fichier existe de manière synchrone:

var file = 'info.json';
var content = '';

// Check that the file exists locally
if(!fs.existsSync(file)) {
  console.log("File not found");
}

// The file *does* exist
else {
  // Read the file and do anything you want
  content = fs.readFileSync(this.local, 'utf-8');
}
18
Francisco Presencia

Vous devez détecter l'erreur, puis vérifier de quel type d'erreur il s'agit.

try {
  var data = fs.readFileSync(...)
} catch (err) {
  // If the type is not what you want, then just throw the error again.
  if (err.code !== 'ENOENT') throw err;

  // Handle a file-not-found error
}
9
loganfsmyth

J'utilise un lambda immédiatement invoqué pour ces scénarios:

const config = (() => {
  try {
    return JSON.parse(fs.readFileSync('config.json'));
  } catch (error) {
    return {};
  }
})();

async version:

const config = await (async () => {
  try {
    return JSON.parse(await fs.readFileAsync('config.json'));
  } catch (error) {
    return {};
  }
})();
3
sdgfsdh