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

Node.js 在Node中,我如何优雅地处理需要读取其目录中文件的模块?,node.js,path,require,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 =

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

|--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);
运行
节点栏.js
,我得到:

财政司司长:663 返回binding.open(路径模块.toNamespacedPath(路径), ^

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$ 
错误:enoint:没有这样的文件或目录,请打开'foo.txt'
在Object.fs.openSync(fs.js:663:18)
在Object.fs.readFileSync(fs.js:568:33)
在对象处。(/Users/fteh/Documents/Projects/playerly/dir/readfile.js:3:14)
在模块处编译(Module.js:660:30)
在Object.Module.\u extensions..js(Module.js:671:10)
在Module.load(Module.js:573:32)
在tryModuleLoad时(module.js:513:12)
在Function.Module.\u加载(Module.js:505:3)
at Module.require(Module.js:604:17)
根据需要(内部/module.js:11:18)
Fabians MacBook Pro:操场费$
我知道这与bar.js中的
require('./dir/readfile')
有关,因为Node然后会尝试在与“bar.js”相同的目录中搜索“foo.txt”。目前,我的修复方法是使用
path.dirname(\uu文件名)
获取绝对路径,无论我是在运行模块目录还是需要它,它都会起作用。我想知道是否有更优雅的方式进行操作。

使用in
readfile.js
如下:

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);

需要。解决

…返回已解析的文件名


使用
\uuuu dirname
构建路径,因为路径始终指向加载模块的目录,而不考虑当前目录。这是传递到模块中的变量之一,因此它在每个模块的作用域中都有一个唯一的值,其目的正是为了满足您的需要(执行与模块目录相关的文件操作)

\uuu dirname
的参考信息

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

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

console.log(foo);

module.exports = {foo};