2014-02-22 149 views
1

我想將模塊導出到我的路由文件。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是一個文件夾。我只是遵循同樣的原則。

+1

http://nodejs.org/api/modules.html – bryanmac

回答

3

如果您嘗試使用require目錄,則預計該目錄中將有index.js文件。否則,您只需要單個文件:​​。或者,你可以創建一個index.js文件中controllers目錄,並添加以下內容:

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

,然後輸入:var c = require('./controllers');。然後您可以通過c.usersc.posts使用它們。

+0

那麼如何調用我對users.js的導出呢? – majidarif

+0

@majimboo不知道我是否理解你的問題。 [see here](http://nodejs.org/api/modules.html#modules_the_module_object)獲取模塊對象的更多細節。 – dparpyani

1

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

在您的情況下,它無法找到名爲controller.js的文件,因此它假設它是一個目錄,然後專門搜索index.js。這就是爲什麼它在快速示例中起作用。

爲了您的用例,你可以做這樣的事情 -

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

來源: http://nodejs.org/api/modules.html

LOAD_AS_DIRECTORY(X)

  1. 如果X /的package.json是一個文件, 一個。解析X/package.json,並查找「main」字段。灣讓M = X +(JSON主場)c。 LOAD_AS_FILE(M)
  2. 如果X/index.js是一個文件,請將X/index.js加載爲JavaScript文本。 STOP
  3. 如果X/index.node是一個文件,請將X/index.node加載爲二進制附件。 STOP

所以,如果一個目錄有索引。JS,它會加載。

現在,看看@ expressjs

http://expressjs.com/guide.html

創建:MYAPP /路線

創建:MYAPP /路由/ index.js

花一些時間來真正讀懂如何模塊的工作是花時間。 Read here

+0

感謝您的資源:) – majidarif