var content;
fs.readFile('./Index.html', function read(err, data) {
if (err) {
throw err;
}
content = data;
});
console.log(content);
Protokolle undefined
, warum?
javascript
node.js
Karaxuna
quelle
quelle
Antworten:
Um näher auf das einzugehen, was @Raynos gesagt hat, haben Sie eine asynchrone Rückruffunktion definiert. Es wird nicht sofort ausgeführt, sondern ausgeführt, wenn das Laden der Datei abgeschlossen ist. Wenn Sie readFile aufrufen, wird die Steuerung sofort zurückgegeben und die nächste Codezeile ausgeführt. Wenn Sie also console.log aufrufen, wurde Ihr Rückruf noch nicht aufgerufen, und dieser Inhalt wurde noch nicht festgelegt. Willkommen bei der asynchronen Programmierung.
Beispielansätze
Oder noch besser, wie das Beispiel von Raynos zeigt, wickeln Sie Ihren Anruf in eine Funktion ein und übergeben Sie Ihre eigenen Rückrufe. (Anscheinend ist dies eine bessere Vorgehensweise.) Ich denke, wenn Sie sich angewöhnen, Ihre asynchronen Aufrufe in eine Funktion zu verpacken, die einen Rückruf erfordert, sparen Sie viel Ärger und unordentlichen Code.
quelle
'utf8'
nach dem Dateinamen einen zusätzlichen Parameter einfügen, da sonst nur ein Puffer zurückgegeben wird. Siehe: stackoverflow.com/questions/9168737/…Hierfür gibt es tatsächlich eine Synchronfunktion:
http://nodejs.org/api/fs.html#fs_fs_readfilesync_filename_encoding
Asynchron
fs.readFile(filename, [encoding], [callback])
Liest asynchron den gesamten Inhalt einer Datei. Beispiel:
Dem Rückruf werden zwei Argumente (err, data) übergeben, wobei data der Inhalt der Datei ist.
Wenn keine Codierung angegeben ist, wird der Rohpuffer zurückgegeben.
SYNCHRON
fs.readFileSync(filename, [encoding])
Synchrone Version von fs.readFile. Gibt den Inhalt der Datei mit dem Namen Dateiname zurück.
Wenn die Codierung angegeben ist, gibt diese Funktion eine Zeichenfolge zurück. Andernfalls wird ein Puffer zurückgegeben.
quelle
data
.if (Buffer.isBuffer( data){ result = data.toString('utf8'); }
Jetzt haben wir den Puffer in lesbaren Text umgewandelt. Dies ist gut zum Lesen einer Klartextdatei oder zum Testen der Datei anhand von Formattypen. Ich könnte versuchen / fangen, um zu sehen, ob es sich zum Beispiel um eine JSON-Datei handelt. aber erst nachdem der Puffer in Text konvertiert wurde. Weitere Informationen finden Sie hier: nodejs.org/api/buffer.htmlAF 42 F1
. Sehr praktisch für die Client-Server-Client-Kommunikation.quelle
function readContent(callback)
istcallback
ein reserviertes Wort? Ich meine, ist dies die Standardmethode, um Rückrufe für Ihre benutzerdefinierten Funktionen zu implementieren? Ich habe gerade angefangen, Knoten zu lernen.event
oder einc
beliebiger Name, den Sie mögen - es ist kein reserviertes Wort in Javascript, und ich würde annehmen, dass sich das gleiche auf Node.js erstreckt.readContent(function (err, content)
gibt mir einen Syntaxfehler, wenn ich die Funktion als Parameter verwende.Versprechen mit ES7 verwenden
Asynchrone Verwendung mit mz / fs
Das
mz
Modul bietet vielversprechende Versionen der Kernknotenbibliothek. Ihre Verwendung ist einfach. Installieren Sie zuerst die Bibliothek ...Dann...
Alternativ können Sie sie in asynchronen Funktionen schreiben:
quelle
Verwenden Sie diese Option, um eine Datei synchron aufzurufen, ohne die angezeigte Ausgabe als Puffer zu codieren.
quelle
Diese Linie wird funktionieren,
quelle
fs.readFileSync
ist eine Synchronisierungsmethode, daher ist dies nicht erforderlichawait
. Warten ist nützlich bei Versprechungen ( nodejs.org/api/fs.html#fs_fs_promises_api ), wenn Sie asynchronen Code mit einer Syntax ähnlich dem Synchronisierungscode schreiben möchten.quelle
Lesemethode für synchrone und asynchrone Dateien:
Node Cheat Verfügbar unter read_file .
quelle
Wie gesagt,
fs.readFile
ist eine asynchrone Aktion. Wenn Sie den Knoten anweisen, eine Datei zu lesen, müssen Sie berücksichtigen, dass dies einige Zeit dauern wird. In der Zwischenzeit führte der Knoten den folgenden Code weiter aus. In Ihrem Fall ist es:console.log(content);
.Es ist, als würde man einen Teil Ihres Codes für eine lange Reise senden (wie das Lesen einer großen Datei).
Schauen Sie sich die Kommentare an, die ich geschrieben habe:
Deshalb
content
ist es immer noch leer, wenn Sie es protokollieren. Der Knoten hat den Inhalt der Datei noch nicht abgerufen.Dies könnte behoben werden, indem Sie
console.log(content)
direkt danach in die Rückruffunktion wechselncontent = data;
. Auf diese Weise sehen Sie das Protokoll, wenn der Knoten die Datei gelesen hat und danachcontent
einen Wert erhält.quelle
Verwenden Sie die integrierte Promisify-Bibliothek (Knoten 8+), um diese alten Rückruffunktionen eleganter zu gestalten.
quelle
const doStuff = async (filePath) => fs.readFileSync(filePath, 'utf8');
, ohne dass util.promisify Wrap erforderlich ist.quelle
Dies liegt nur daran, dass der Knoten asynchron ist und nicht auf die Lesefunktion wartet. Sobald das Programm gestartet wird, wird der Wert als undefiniert getröstet. Dies ist tatsächlich der Fall, da der Inhaltsvariablen kein Wert zugewiesen ist. Um damit umzugehen, können wir Versprechen, Generatoren usw. verwenden. Wir können Versprechen auf diese Weise verwenden.
quelle
Die folgende Funktion würde für
async
Wrap- oder Versprechen-then
Ketten funktionierenquelle
Sie können die Datei von lesen
Hinzufügen Sie können in Datei schreiben,
und sogar verketten
quelle
Um es grob auszudrücken, Sie haben es mit node.js zu tun, das asynchroner Natur ist.
Wenn wir über Async sprechen, sprechen wir über das Ausführen oder Verarbeiten von Informationen oder Daten, während wir uns mit etwas anderem befassen. Es ist nicht gleichbedeutend mit parallel, bitte sei daran erinnert.
Dein Code:
Bei Ihrem Beispiel wird zunächst der Teil console.log ausgeführt, sodass die Variable 'content' undefiniert ist.
Wenn Sie die Ausgabe wirklich möchten, gehen Sie stattdessen folgendermaßen vor:
Dies ist asynchron. Es wird schwer zu gewöhnen sein, aber es ist was es ist. Auch dies ist eine grobe, aber schnelle Erklärung dafür, was Asynchronität ist.
quelle