180 votes

fs.readFileSync n'est pas relatif au fichier ? Node.js

-Supposons que j'ai un fichier à la racine de mon projet appelé file.xml .

-Supposons que j'ai un fichier de test dans tests/ appelé "test.js" et qu'il a

const file = fs.readFileSync("../file.xml");

Si je lance maintenant node ./tests/test.js Dans la racine de mon projet, il est écrit ../file.xml n'existe pas. Si j'exécute la même commande depuis le répertoire des tests, cela fonctionne.

Il semble fs.readFileSync est relatif au répertoire à partir duquel le script est invoqué, au lieu de l'endroit où se trouve réellement le script. Si j'ai écrit fs.readFileSync("./file.xml") en test.js cela serait plus déroutant et n'est pas cohérent avec les chemins relatifs dans un fichier require qui sont relatifs au fichier.

Pourquoi ? Comment puis-je éviter d'avoir à réécrire les chemins d'accès dans mon fichier fs.readFileSync ?

6 votes

__dirname n'est pas nécessairement le même que le répertoire de travail actuel, mais fs.readFileSync() utilise le répertoire de travail actuel. Le répertoire de travail actuel est probablement défini comme ce qu'il était lorsque vous avez lancé node.

301voto

cartant Points 35253

Vous pouvez résoudre le chemin relatif à l'emplacement du fichier source - plutôt que le répertoire courant - en utilisant path.resolve :

const path = require("path");
const file = fs.readFileSync(path.resolve(__dirname, "../file.xml"));

1 votes

Merci. Cela fonctionne et je suis tenté de l'accepter, mais avez-vous une idée de la raison pour laquelle cela est nécessaire ? J'aimerais pouvoir expliquer aux développeurs de mon équipe pourquoi cette étape supplémentaire n'est pas nécessaire dans une déclaration require. Ex : si j'avais un module dans le répertoire racine appelé module.js, je n'aurais qu'à faire require("../module.js") dans test.js.

13 votes

Parce que les chemins relatifs sont résolus en utilisant le répertoire courant. Et vous voulez les résoudre en utilisant un répertoire différent. Depuis le docs : "Le chemin relatif à un nom de fichier peut être utilisé. Rappelez-vous, cependant, que ce chemin sera relatif à process.cwd()."

0 votes

Pour une raison quelconque, je me suis mis dans la tête que parce que le fichier local ne fonctionnait pas sur mon environnement distant, j'aurais besoin d'obtenir le fichier par une url complète. Mais bien sûr, ce n'était pas le cas et j'ai pu utiliser cette méthode pour résoudre le chemin absolu sur mon serveur distant

10voto

Halcyon991 Points 431

Juste pour développer ce qui précède, si vous utilisez fs.readFileSync con TypeScript (et bien sûr CommonJS) voici la syntaxe :

import fs from 'fs';
import path from 'path';

const logo = fs.readFileSync(path.resolve(__dirname, './assets/img/logo.svg'));

Cela s'explique par le fait que fs.readFileSync() est résolu par rapport au répertoire de travail actuel, voir l'onglet Système de fichiers Node.js pour plus d'informations.

Source : Chemins relatifs fs.readFileSync avec Node.js

Et bien sûr, le format CommonJS :

const fs = require('fs');
const path = require('path');

const logo = fs.readFileSync(path.resolve(__dirname, './assets/img/logo.svg'));

0 votes

Je ne suis pas sûr de voir comment cela élargit la réponse acceptée, cela me semble exactement la même chose path.resolve avec __dirname et un chemin relatif.

0 votes

@404 Oui, j'incluais les gens de TypeScript :) le code est le même mais en utilisant des déclarations d'importation.

0voto

Renatex Points 696

Une autre alternative si vous utilisez type module est d'utiliser process.cwd()

paquet.json

{
    "type": "module",
}

console.log(process.cwd() + relative_path) // /User/your_user/path_to_folder

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X