NodeJS fs并要求在不同的地方寻找

时间:2016-11-26 09:30:08

标签: javascript node.js require fs

我正在尝试遍历目录并要求其中的每个文件。我的代码正在运行,但我想知道为什么我必须修改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"
}

2 个答案:

答案 0 :(得分:2)

require是一个Node函数。只是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(path.join('../modules/', file))

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

这是有效的,因为require不会改变绝对路径,因为它会通过预先__dirname来改变相对路径。

答案 1 :(得分:0)

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