2017-03-22 4 views
0

Ich versuche dies in Visual Studio-Code unter Windows 10 mit powershell.exe als Terminal.learnyounode: # 3 Meine erste I/O

Nach vielen Misserfolgen erreichte ich den Höhepunkt im Internet, um seine Lösung zu finden.

Hier ist die Lösung, die ich aus dem Internet bekommen haben:

var fs = require('fs'); 
       
var contents = fs.readFileSync(process.argv[2]); 
var lines = contents.toString().split('\n').length - 1; 
console.log(lines); 

ich es in einer Datei gespeichert, myFirstIO.js. Allerdings habe ich versucht, es auf Powershell ausgeführt erhielt ich folgende Fehlermeldung:

PS C:\Users\aps12\Desktop\Test\lyn> node myFirstIO.js 
fs.js:640 
    return binding.open(pathModule._makeLong(path), stringToFlags(flags), mode); 
       ^

TypeError: path must be a string or Buffer 
    at TypeError (native) 
    at Object.fs.openSync (fs.js:640:18) 
    at Object.fs.readFileSync (fs.js:508:33) 
    at Object.<anonymous> (C:\Users\aps12\Desktop\Test\lyn\myFirstIO.js:3:19) 
    at Module._compile (module.js:570:32) 
    at Object.Module._extensions..js (module.js:579:10) 
    at Module.load (module.js:487:32) 
    at tryModuleLoad (module.js:446:12) 
    at Function.Module._load (module.js:438:3) 
    at Module.runMain (module.js:604:10) 

Aber wenn getippt,

PS C:\Users\aps12\Desktop\Test\lyn> learnyounode verify myFirstIO.js 

Überraschenderweise Lösung wurde übergeben.

# PASS Your solution to MY FIRST I/O! passed! 

Ich frage mich, warum die Lösung auch dann bestanden wird, wenn sie nicht lief. Warum wurde die Lösung nicht ausgeführt? Was ist der Fehler, den ich dort gemacht habe? PS: Ich habe bereits die ersten beiden Module learnyounode ohne jeden Fehler gelöscht.

Antwort

1

Wenn Sie dieses Programm mit node myFirstIO.js laufen wird es einen Fehler aus, weil es eine Datei als zweites Argument erwartet

/* 
on this line, file being read using readFileSync and saving it to a 
contents variable 
*/ 
var contents = fs.readFileSync(process.argv[2]); 

Wenn Sie den Fehler TypeError: path must be a string or Buffer bemerken, erwartet, dass es einen Dateipfad String oder Datei-Stream als zweites Streit.

Wenn Sie dieses Programm mit learnyounode ausführen, führen Sie es implizit mit einer Datei aus, Sie können es auch testen, indem Sie es wie node myFirstIO.js textfile.txt ausführen Hinweis, Dateipfad muss gültig sein.

Wenn Sie dieses Programm wie node myFirstIO.js "Hello World" ausführen, wird es nicht funktionieren, da es einen Dateipfad oder Stream nicht eine Zeichenfolge erwartet. Ich hoffe, dies hilft Ihnen, dieses Problem zu verstehen.

0

process.argv gibt alle in der Befehlszeile angegebenen Argumente zurück.

Wenn Sie > node myFirstIO.js tun, werden Sie diese Argumente zu übergeben process.argv:

['node', 'myFirstIO.js']

... Es warf einen Fehler weil du für das dritte Argument gefragt wurden (process.argv [ 2]), die Sie in der Befehlszeile nicht übergeben haben.

über process.argvhere lesen.

nun für learnyounode, entweder ich nehme an, Sie das dritte Argument übergeben, wenn Sie verwendet:

> learnyounode verify myFirstIO.js

die JS-Datei als drittes Argument verwendet wird; oder learnyounode ist buggy.

+0

Auch wenn ich so etwas verwendet: '> Knoten myFirstIO.js" Hallo Welt "' Es zeigte immer noch den gleichen Fehler. – aps120797

+0

Aus der Sicht Ihres Codes muss das dritte Argument ein Dateiname sein. Es könnte ein relativer Pfad vom Ordner oder ein absoluter Pfad sein. Es muss * path * + * file.extension * sein. Sag mal, wenn Ihr Code nur diese Zeile: '' 'console.log (process.argv [2])' '' diese '' '> node myFirstIO.js "Hallo Welt"' '' sollte funktionieren, aber da Sie mit dem FS-Modul arbeiten, erfordert es den Pfad einer Datei als Argument übergeben. –