Problèmes avec l'utilisation de fs.stat en nodejs
J'ai essayer de faire lire le fichier de paramètres. Quand je fais ce code:
var fs = require('fs'),
size = new Object();
fs.stat(file, function(err,stats){
if(!err){
size=stats;
}
})
console.log(size);
C'est ok, quand j'essaie d'utiliser la fonction:
var fs = require('fs'),
size = new Object();
function writeinfile(file){
fs.stat(file, function(err,stats){
if(!err){
size=stats;
}
})
console.log(size.size);
}
writeinfile('error.log');
Il n'est pas du travail. Pourriez-vous m'aider que la variante 2 de travail?
Vous devez vous connecter pour publier un commentaire.
Votre console.le journal est à l'extérieur de votre fs.stat de rappel. Il fixe:
Aussi, je l'ai réécrit votre code pour utiliser plus idiomatique (plus commun) de la syntaxe dans Node.js:
Comme Herman mentionné dans sa réponse, ce serait une bonne idée de choisir un meilleur nom de fonction si vous n'êtes pas à l'écriture des fichiers.
Dernière chose, en Javascript, vous pouvez utiliser
{}
comme un raccourci pournew Object()
. Par exemple:var size = {};
Dans votre exemple, il n'est pas correct de s'attendre à ce que la valeur de la taille à définir lors de la console.log(taille) s'exécute en raison de la nature asynchrone de fs.stat().
Voici ce qui se produit réellement, dans l'ordre:
fs
module et instancier une nouvellesize
objet.En passe des choses dans cet ordre, parce que la quantité de temps qu'il faut pour rendre le fichier requis système d'appel ne peut pas être prédit à l'avance en raison de la nature asynchrone des e /s de fichier. Selon ce que le disque est en train de faire, il peut prendre n'importe où de 4 à 4000ms, ou plus.
C'est pourquoi, nous comptons sur les rappels, car ils sont garantis pour se produire lorsque la fonction qu'elles ont été appliquées à l'est complète, ou dans ce cas, lorsque l'état du chemin d'accès a été déterminée.
Et s'il vous plaît ne vous sentez pas mal. C'est une erreur tout le monde fait lors de la programmation asynchrone et il est le plus difficile concept pour envelopper la tête autour de la programmation de nœud.
Vous avez besoin de mettre la console.journal(de la taille.taille); dans la fonction de rappel, mais je pense que j'ai besoin d'expliquer mieux.
Vous avez besoin d'apprendre au sujet des appels asynchrones et la Node.js Boucle d'Événements. Node.js a été créé pour paralelize ressources dans une meilleure façon que la création de threads pour les problèmes qui sont plus IO Intensive (comme les serveurs web) de l'UC. L'idée est qu'un seul fil pour la logique de non-blocage des appels d'utiliser IO est mieux que de créer plusieurs threads et d'appel des blocs de fonction à utiliser IO.
Si vous programme dans une autre langue, vous devez être familier avec le sinchronous de votre version de l'algorithme:
C'est Node.js le code, mais ce n'est pas le Nœud du chemin. Lorsque vous appelez statSync(), le script de votre bloc d'attendre pour lire les stats à partir du disque.
MAIS, lorsque vous utilisez
fs.stat()
, votre programme s'exécute jusqu'à la fin du code, TANDIS que le disque est en lecture. Toutes les lignes suivantes sera exécuté avant le programme de parvenir à la Boucle d'Événements. Juste au moment où la stat être prêt et le programme s'exécute jusqu'à la fin, la boucle d'événements va appeler la fonction de rappel qui vous passe par argument dansfs.stat(callback)
appel.Donc, dans votre code, vous appelez une stat (assynchronous version), et essayez d'utiliser une valeur qui n'est pas encore prêt, parce que le code après le assynchronous appels sera toujours exécuté avant le callback sera appelé.
La première version, je pense que le travail juste parce que vous devriez être typping manuellement le code dans l'interpréteur, donc, le temps que vous devez taper la ligne suivante est assez pour le programme de parvenir à la boucle d'événements. Dans ce mode, chaque fois que vous tapez une commande, appuyez sur entrée et que le code est exécuté, qui est, vous obtenez un retour, les événements dans la boucle d'événement sera appelé après.
Il y a plusieurs observations de votre code. Mais nous sommes ici pour apprendre:
Assurez-vous de mettre le
console.log
à l'intérieur de la fonction de rappel (c'est à dire juste en dessous desize=stats
), de cette façon, vous pouvez obtenir les informations dont vous avez besoin, une fois que la fonction ne sa tâche.Ajouter cette ligne au-dessus de
if (!err)
:if (err) de la console.log(err);
Vous verrez ce qui suit
Qui signifie une erreur sur le chemin. Solution facile: Utilisez fs.exists() pour vérifier si le fichier existe, et /ou, assurez-vous toujours que le préfixe de votre nom de fichier avec
__dirname
.writeinfile
, maisfs.stats
vous donne des informations sur le fichier... je suggère qu'une meilleure fonction serait fs.write() pour cette tâche.