var content;
fs.readFile('./Index.html', function read(err, data) {
if (err) {
throw err;
}
content = data;
});
console.log(content);
Erreur : le contenu est indéfini. Pouvez-vous m'aider ?
var content;
fs.readFile('./Index.html', function read(err, data) {
if (err) {
throw err;
}
content = data;
});
console.log(content);
Erreur : le contenu est indéfini. Pouvez-vous m'aider ?
Pour développer ce que @Raynos a dit, la fonction que vous avez définie est un callback asynchrone. Elle ne s'exécute pas immédiatement, mais plutôt lorsque le chargement du fichier est terminé. Lorsque vous appelez readFile, le contrôle est retourné immédiatement et la ligne de code suivante est exécutée. Ainsi, lorsque vous appelez console.log, votre callback n'a pas encore été invoqué, et ce contenu n'a pas encore été défini. Bienvenue dans la programmation asynchrone.
Exemples d'approches
var content;
// First I want to read the file
fs.readFile('./Index.html', function read(err, data) {
if (err) {
throw err;
}
content = data;
// Invoke the next step here however you like
console.log(content); // Put all of the code here (not the best solution)
processFile(); // Or put the next step in a function and invoke it
});
function processFile() {
console.log(content);
}
Ou mieux encore, comme le montre l'exemple de Raynos, intégrez votre appel dans une fonction et passez vos propres callbacks. (Apparemment, c'est une meilleure pratique) Je pense que prendre l'habitude d'envelopper vos appels asynchrones dans une fonction qui prend un callback vous épargnera beaucoup de problèmes et de code désordonné.
function doSomething (callback) {
// any async callback invokes callback with response
}
doSomething (function doSomethingAfter(err, result) {
// process the async result
});
Sync I/O a sa place - c'est bien si vous faites un petit système ou outil de construction. Sur des systèmes plus importants ou des applications serveur, la meilleure pratique est de l'éviter.
Tout n'est pas un serveur web. Et il n'y a rien d'horrible à utiliser des versions synchronisées de méthodes pour des appels ponctuels avant que le serveur ne commence à prendre des requêtes. Toute personne utilisant Node devrait vraiment comprendre pourquoi avant de l'utiliser. Et surtout avant d'en parler sur son blog.
Il existe en fait une fonction synchrone pour cela :
http://nodejs.org/api/fs.html#fs_fs_readfilesync_filename_encoding
fs.readFile(filename, [encoding], [callback])
Lit de manière asynchrone l'intégralité du contenu d'un fichier. Exemple :
fs.readFile('/etc/passwd', function (err, data) {
if (err) throw err;
console.log(data);
});
La fonction de rappel reçoit deux arguments (err, data), où data est le contenu du fichier.
Si aucun encodage n'est spécifié, alors le tampon brut est retourné.
fs.readFileSync(filename, [encoding])
Version synchrone de fs.readFile. Renvoie le contenu du nom de fichier.
Si l'encodage est spécifié, cette fonction renvoie une chaîne de caractères. Sinon, elle renvoie un tampon.
var text = fs.readFileSync('test.md','utf8')
console.log (text)
Question rapide, quelle est l'utilisation du tampon qui est retourné dans la version synchrone de readFile ? Si je lis un fichier de manière synchrone et que je ne passe pas d'encodage, le tampon est imprimé, comment puis-je l'utiliser ? Merci.
J'en ai fait l'expérience récemment. Disons que notre tampon est data
. if (Buffer.isBuffer( data){ result = data.toString('utf8'); }
Maintenant, nous avons converti le tampon en texte lisible. C'est une bonne chose pour lire un fichier en texte clair ou pour tester le fichier par rapport à des types de format. Je pourrais faire un try/catch pour voir s'il s'agit d'un fichier JSON par exemple, mais seulement après que le tampon ait été converti en texte. Regardez ici pour plus d'informations : nodejs.org/api/buffer.html
Bonjour, dans la première ligne de votre code, function readContent(callback)
c'est callback
un mot réservé ? Je veux dire, est-ce la façon standard d'implémenter des callbacks pour vos fonctions personnalisées ? Je viens de commencer à apprendre Node.
Salut Amal. Le callback est simplement l'argument passé à sa fonction, il peut être event
ou c
ou le nom que vous voulez - ce n'est pas un mot réservé en Javascript, et je suppose que la même chose s'applique à Node.js.
Le site mz
fournit des versions promises de la bibliothèque centrale des nœuds. Leur utilisation est simple. Installez d'abord la bibliothèque...
npm install mz
Alors...
const fs = require('mz/fs');
fs.readFile('./Index.html').then(contents => console.log(contents))
.catch(err => console.error(err));
Vous pouvez également les écrire dans des fonctions asynchrones :
async function myReadfile () {
try {
const file = await fs.readFile('./Index.html');
}
catch (err) { console.error( err ) }
};
Semble intéressant. Une coquille : "console.error(catch)" devrait être "console.error(err)", je suppose.)
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.
2 votes
Fs.readFileSync possède également des fonctionnalités intéressantes pour lire un fichier même s'il est au format unicode utf8.
0 votes
N.B. fs.readFile peut aussi faire cela ^ voir ma réponse ci-dessous