提问人:antun 提问时间:6/29/2013 最后编辑:Blenderantun 更新时间:6/29/2013 访问量:6446
规范化 node.js 中的文件路径
Normalizing a file path in node.js
问:
我有一个 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(),但这实际上去除了任何前导“./”。
谢谢!
答:
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/catch
JSON.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);
});
评论