【问题标题】:learnyounode: #3 My First I/Olearnyounode:#3 我的第一个 I/O
【发布时间】:2017-03-22 15:00:53
【问题描述】:

我正在 Windows 10 上的 Visual Studio Code 中尝试此操作,并使用 powershell.exe 作为终端。

在多次失败后,我上网寻找解决方案。

这是我从互联网上得到的解决方案:

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

我将它保存在文件 myFirstIO.js 中。但是,我尝试在 PowerShell 上运行它,我收到以下错误:

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)

但输入时,

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

令人惊讶的是,解决方案通过了。

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

我想知道为什么解决方案即使没有运行也会通过。 另外,为什么解决方案没有运行?我在那里犯了什么错误? PS:learnyounode的前两个模块我已经通关了,没有任何失败。

【问题讨论】:

    标签: javascript node.js powershell npm visual-studio-code


    【解决方案1】:

    如果你使用node myFirstIO.js 运行这个程序,它会抛出一个错误,因为它需要一个文件作为第二个参数

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

    如果您注意到错误 TypeError: path must be a string or Buffer,它需要文件路径字符串或文件流作为第二个参数。

    当你用 learnyounode 运行这个程序时,它们会隐式地用一个文件运行它,你也可以像node myFirstIO.js textfile.txt一样运行它来测试它 注意,文件路径必须有效。

    如果你像node myFirstIO.js "Hello World" 这样运行这个程序,它将无法工作,因为它需要文件路径或流而不是字符串。希望这可以帮助您理解这个问题。

    【讨论】:

      【解决方案2】:

      process.argv 返回命令行中给出的所有参数。

      当您执行&gt; node myFirstIO.js 时,您将这些参数传递给 process.argv:

      ['node', 'myFirstIO.js']

      ...它抛出了一个错误,因为您要求第三个参数 (process.argv[2]),而您没有在命令行中传递。

      阅读 process.argv here

      现在,对于 learnyounode,我假设您在使用时传递了第三个参数:

      &gt; learnyounode verify myFirstIO.js

      使用 JS 文件作为第三个参数;或 learnyounodebuggy

      【讨论】:

      • 即使我使用了这样的东西:&gt; node myFirstIO.js "Hello World" 它仍然显示同样的错误。
      • 从您的代码的角度来看,第三个参数必须是文件名。它可以是文件夹的相对路径,也可以是绝对路径。它必须是 path + file.extension。比如说,如果你的代码只有这一行:console.log(process.argv[2]) 这个&gt; node myFirstIO.js "hello world" 应该可以工作,但是由于你正在使用 FS 模块,它需要作为参数传递的文件的路径。
      猜你喜欢
      • 1970-01-01
      • 2022-01-13
      • 2015-05-24
      • 2023-03-10
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多