4

我有一个 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

2 回答 2

8

您可以使用,可选地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);
});
于 2013-06-28T21:46:36.077 回答
4

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

var parsedJSON = JSON.parse(fs.readFileSync(filename));
于 2013-06-28T21:41:35.107 回答