在Node中,如何优雅地处理需要读取其目录中文件的模块?

时间:2018-03-10 15:21:23

标签: node.js path require

例如,在我的项目目录中,我有:

|--bar.js
|--dir
   |--foo.txt
   |--readfile.js

readfile.js:

const fs = require('fs');

var foo = fs.readFileSync('foo.txt', 'utf8');

console.log(foo);

module.exports = {foo};

运行node readfile.js,一切正常。

bar.js:

const readfile = require('./dir/readfile');

console.log(read.foo);

运行node bar.js,我得到:

fs.js:663   return binding.open(pathModule.toNamespacedPath(path),                  ^

Error: ENOENT: no such file or directory, open 'foo.txt'
    at Object.fs.openSync (fs.js:663:18)
    at Object.fs.readFileSync (fs.js:568:33)
    at Object.<anonymous> (/Users/fterh/Documents/Projects/playground/dir/readfile.js:3:14)
    at Module._compile (module.js:660:30)
    at Object.Module._extensions..js (module.js:671:10)
    at Module.load (module.js:573:32)
    at tryModuleLoad (module.js:513:12)
    at Function.Module._load (module.js:505:3)
    at Module.require (module.js:604:17)
    at require (internal/module.js:11:18)
Fabians-MacBook-Pro:playground fterh$ 

我知道它与bar.js中的require('./dir/readfile')有关,因为Node会尝试搜索&#34; foo.txt&#34;与&#34; bar.js&#34;在同一目录中。目前,我的修复方法是使用path.dirname(__filename)获取绝对路径,无论我是运行模块目录还是需要它,都可以使用。我想知道是否有更优雅的做事方式。

2 个答案:

答案 0 :(得分:1)

readfile.js中使用require.resolve,如下所示:

const fs = require('fs');

let foo = fs.readFileSync(require.resolve('./foo.txt'), 'utf8');

console.log(foo);

module.exports = {foo};

注意:在bar.js的原始问题中,可能有意写:console.log(readfile.foo);

<强> require.resolve

  

...返回已解析的文件名

答案 1 :(得分:0)

使用__dirname构建路径,因为无论当前目录如何,路径始终指向加载模块的目录。这是传递给模块的变量之一,因此它在每个模块的范围内具有唯一值,并且它的目的是准确地满足您的需求(相对于您的模块执行文件操作&#39; s目录)。

const fs = require('fs');
const path = require('path');

var foo = fs.readFileSync(path.join(__dirname, 'foo.txt'), 'utf8');

console.log(foo);

module.exports = {foo};

__dirname here的参考信息。