规范化 node.js 中的文件路径

Normalizing a file path in node.js

提问人:antun 提问时间:6/29/2013 最后编辑:Blenderantun 更新时间:6/29/2013 访问量:6446

问:

我有一个 node.js 脚本,它接受一个文件名参数,然后使用 require() 使用它:

json2csv.js

var filename = process.argv[2]; 
var parsedJSON = require(filename);

我按如下方式运行它:

$ node json2csv.js ./inputFile.json

只要我用“./”显式地为文件(如果是本地)加上前缀,或者我使用绝对文件路径,这就可以工作。但是,如果我省略了“./”,例如:

$ node json2csv.js inputFile.json

我收到“找不到模块”错误,因为节点正在将文件名解释为模块名称。有没有一种标准方法可以在节点中处理文件路径,以便将它们输出为显式本地路径或绝对路径?

我知道为我的场景写作并不难;我只是在寻找一种可以跨平台工作的标准方式。我找到了 Path.normalize(),但这实际上去除了任何前导“./”。

谢谢!

节点.js

评论


答:

4赞 Dan D. 6/29/2013 #1

你真的不应该那样使用。相反,你应该做:require

var parsedJSON = JSON.parse(fs.readFileSync(filename));

评论

1赞 antun 6/29/2013
谢谢,这很完美。我必须首先做:fs = require('fs'),然后它起作用了。虽然我不得不选择乔纳森的答案作为官方答案,因为它更简洁地回答了我的问题。
0赞 Mike 'Pomax' Kamermans 5/13/2019
请注意,对于已知良好的 .json 文件(例如配置文件),情况并非如此。更重要的是,请注意,上面的代码需要放在一个块中,因为可能会并且会在格式错误的 JSON 上抛出错误,你应该有适当的代码来处理这个问题。try/catchJSON.parse
8赞 Jonathan Lonowski 6/29/2013 #2

您可以使用 path.resolve(),也可以选择将 process.cwd() 传递给 from

var path = require('path');
var filepath = path.resolve(process.cwd(), process.argv[2]);

例子:

console.log(path.resolve('/foo/bar', 'baz'));   // "/foo/bar/baz"
console.log(path.resolve('/foo/bar', './baz')); // "/foo/bar/baz"
console.log(path.resolve('/foo/bar', '/baz'));  // "/baz"

但是,为了避免缓存,您应该直接读取文件:require()

fs.readFile(filepath, function (err, jsonData) {
    var result = JSON.parse(jsonData);
});