我正在尝试遍历目录并要求其中的每个文件。我的代码正在运行,但我想知道为什么我必须修改fs函数中的路径。 (下面的代码被剥夺了无用的信息)
文件夹结构:
project
|-- bin
| `-- start
|-- modules
| |-- file1.js
| `-- file2.js
`-- package.json
/ bin中/开始:
#!/usr/bin/env node
// Require dependencies
var fs = require('fs')
// Get modules
// NOTE: fs is looking in the project folder, but this file is in the bin folder
fs.readdir('./modules', function (err, files) {
// Handle error
if (err) {
console.log(err)
process.exit(1)
}
// Loop through files
files.forEach(function (file, index) {
// Get info about file
fs.stat('./modules/' + file, function (err, stat) {
// Handle error
if (err) {
console.log(err)
process.exit(1)
}
// If it is a file
if (stat.isFile()) {
// NOTE: require is looking in the bin folder, and this file is in the bin folder
require('../modules/' + file)
}
})
})
})
的package.json:
{
"name": "modular-chat",
"version": "1.0.0",
"description": "A simple modular example of a chat application",
"scripts": {
"start": "node ./bin/start"
},
"author": "JoshyRobot",
"license": "MIT"
}
答案 0 :(得分:2)
require
是一个Node函数。只是require
在解析相对路径时使用__dirname
作为基本名称而不是当前工作目录,这也是process.cwd()
的结果。
您只需将__dirname
加入相关路径,然后再将其传递给fs
函数。使用path.join(__dirname, '../modules')
和path.join(__dirname, '../modules', file)
。在fs.readdir
和fs.stat
来电中使用这些:
fs.readdir(path.join(__dirname, '../modules'), function (err, files) {
fs.stat(path.join(__dirname, '../modules', file), function (err, stat) {
这会使你的fs调用和require对齐,以便加载正确的文件。
反向并且要求加载任何路径也不难:
而不是require(path.join('../modules/', file))
:
require(path.join(process.cwd(), '../modules/', file))
这是有效的,因为require
不会改变绝对路径,因为它会通过预先__dirname
来改变相对路径。
答案 1 :(得分:0)
这背后的原因是require('../modules/' + file)
不是节点函数,它是common.js语法。当您运行require
时,它会看到相对于运行require
函数的文件的文件,当您运行fs
模块时,它会相对于节点命令执行。< / p>