NodeJS找不到自定义模块

我正在试图导出一个模块到我的路线文件。

我的文件树就像

routes.js app.js controllers/users.js posts.js 

在我的app.js我导出var route = require('./routes'); 这是有效的。 现在我的routes.js我试图导出require('./controllers');

但它一直告诉我,它cannot find module controllers

这样做的作品:

 require('./controllers/users') 

但是我试图按照expressjs样本初始项目的格式。 而且它正在窃听我,因为expressjs的例子显示:(快递路线是一个文件夹)

 var routes = require('./routes'); 

并加载它

 app.get('/', routes.index); 

没有错误。 而./routes是一个文件夹。 我只是遵循同样的原则。

如果你试图require一个目录,它期望那个目录中有一个index.js文件。 否则,你只需要单独的文件: require('./controllers/users') 。 或者,您可以在controllers目录中创build一个index.js文件,并添加以下内容:

 module.exports.users = require('./users'); module.exports.posts = require('./posts'); 

然后导入: var c = require('./controllers'); 。 然后您可以通过c.usersc.posts使用它们。

你必须明白require()是如何工作的。

在你的情况下,它无法find一个名为controller.js的文件,所以它假设它是一个目录,然后具体searchindex.js 。 这就是为什么它在快速示例中起作用。

对于你的用例,你可以做这样的事情 –

 var controllerPath = __dirname + '/controllers'; fs.readdirSync(controllerPath).forEach(function(file) { require(controllerPath + '/' + file); }); 

来自: http : //nodejs.org/api/modules.html

LOAD_AS_DIRECTORY(X)

  1. 如果X / package.json是一个文件, parsingX / package.json,并查找“main”字段。 湾 让M = X +(json主场)c。 LOAD_AS_FILE(M)
  2. 如果X / index.js是一个文件,则将X / index.js加载为JavaScript文本。
  3. 如果X / index.node是一个文件,则将X / index.node加载为二进制插件。 停

所以,如果一个目录有一个index.js,它会加载它。

现在,看@ expressjs

http://expressjs.com/guide.html

创build:myapp /路由

创build:myapp / routes / index.js

花一些时间真正阅读模块是如何工作的, 在这里阅读