NodeJS所需的模块在其他模块中不可用

时间:2013-08-27 16:15:52

标签: node.js module require

我对NodeJS有点新鲜。也许这只是它的工作方式,但可以肯定:

我的'index.js':

var fs = require('fs');
// do something with fs here
var app = require('./app.js');

'app.js'

fs.readFile('/somedir/somefile.txt', 'utf8', function (err,data) {
  if (err) {
    return console.log(err);
  }
  console.log(data);
});

然后我收到错误:

ReferenceError: fs is not defined

正如我所读到的,对此的“解决方案”是“重新要求”app.js中的fs-module。现在我所理解的是fs模块被缓存(任何模块,但使用示例)所以Node仍然会非常快。我真正得到的是:“如果fs模块被缓存,那么实际上它有点可用,为什么我仍然需要'重新要求'模块?

我会诚实的;只是为了理解原因。

2 个答案:

答案 0 :(得分:35)

每个文件都必须包含对模块的引用

index.js

var fs    = require("fs"),
    other = require("./otherfile"); 

// you can now use `fs`

otherfile.js

var fs = require("fs");

// you can now use `fs` here

关于这一点的最好的部分之一是你没有被锁定在任何给定文件中以某种方式命名变量。每个文件都与lib中的所有其他文件完全隔离,这是非常的好东西。

另外要知道,如果您愿意,可以只包含模块的部分

var read = require("fs").readFile;

read("myfile.txt", function(err, data) {
  if (error) {
    return throw error;
  }
  console.log(data);
};

说明:

Node.js不鼓励使用全局变量;因此,您不应该尝试实现依赖全局变量的东西。

当您再次调用fs模块时,它并不是真正“重新要求”它,因为您只是声明一个指向缓存模块的变量。


其他示例:

this answer中,我详细介绍了如何构建一个避免使用全局变量的简单应用程序。

答案 1 :(得分:4)

有时我们可以忘记它,但声明它是基本的:

var fs = require('fs');