【问题标题】:NodeJS fs and require looking in different placesNodeJS fs 并且需要在不同的地方寻找
【发布时间】:2016-11-26 09:30:08
【问题描述】:

我正在尝试遍历一个目录并要求其中的每个文件。我的代码正在运行,但我想知道为什么我必须修改 fs 函数中的路径。 (下面的代码去掉了无用的信息)

文件夹结构:

project
|-- bin
|   `-- start
|-- modules
|   |-- file1.js
|   `-- file2.js
`-- package.json

/bin/start:

#!/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"
}

【问题讨论】:

  • 观察力不错。

标签: javascript node.js require fs


【解决方案1】:

require 是一个节点函数。只是require在解析相对路径时使用__dirname作为基名,而不是当前工作目录,这也是process.cwd()的结果。

您只需将__dirname 加入您的相对路径,然后再将它们传递给fs 函数。使用 path.join(__dirname, '../modules')path.join(__dirname, '../modules', file)。在您的 fs.readdirfs.stat 调用中使用这些:

fs.readdir(path.join(__dirname, '../modules'), function (err, files) {

fs.stat(path.join(__dirname, '../modules', file), function (err, stat) {

这会使您的 fs 调用和 require 对齐,以便加载正确的文件。


反过来也不是那么难,让 require 加载任何路径:

而不是require(path.join('../modules/', file)):

require(path.join(process.cwd(), '../modules/', file))

这是有效的,因为require 不会像对相对路径那样通过添加__dirname 来更改绝对路径。

【讨论】:

  • 如果fs.readdir('../modules' 也可以,为什么还要使用fs.readdir(path.join(__dirname, '../modules')?问题fs.readdir('./modules' 中提供的代码导致not found 错误
  • @Maximus 不,我提供的代码工作正常,但问题是 fs.readdir(...)require(...) 在不同的地方寻找,这就是为什么 fs.readdir 调用使用路径 @987654343 @ 而 require 使用 ../modulesfs.readdir('../modules'...) 不起作用。
【解决方案2】:

这背后的原因是require('../modules/' + file)不是节点函数,是common.js语法。当你运行require时,它会看到相对于运行require函数的文件的文件,而当你运行fs模块时,它会相对于节点命令执行。

【讨论】:

    猜你喜欢
    • 2020-11-27
    • 2015-09-14
    • 2010-12-06
    • 1970-01-01
    • 1970-01-01
    • 2019-07-31
    • 2016-05-02
    • 2016-09-29
    相关资源
    最近更新 更多