2012-04-03 115 views
11

我在expressjs的單獨文件夾中有路由。該設置對'索引'頁面工作正常,但不適用於任何其他路由。nodejs ExpressJS路由只能用於索引

這是我的index.js,位於我的路線文件夾內。

module.exports = function(db) { 

    return { 
     index: function(req, res, next) { 
      res.send('index'); 
     } 
    } 
} 

這是我的join.js,在我的路線文件夾中。

module.exports = function(db) { 

    return { 
     join: function(req, res, next) { 
      res.send('join'); 
     } 
    } 
} 

在我app.js,我這樣定義我的路線:

  var routes = require('./routes')(db); 
      app.get('/', routes.index); 
      app.get('/join', routes.join); 

當我去http://localhost:3000,但是當我去http://localhost:3000/join我得到Cannot GET /join

如果我定義我的路線加入像這樣:

app.get('/join', function(req, res){ 
    res.send('join 2'); 
}); 

This works。

任何想法我在這裏做錯了嗎?

謝謝!

回答

0

我測試了一個類似的場景,它適用於我。

我猜這個錯誤可能在你的routes.js文件中。 你很可能會做:

routes.index = require('./index')(db); 
routes.join = require('./join')(db); 

也許你忘了調用方法join,只是在做require(./join)。 只是一個猜測。

6

我有一個類似的問題,但後來記住這是所有「只是JavaScript」,並能夠糊塗出答案。

如果你想在多個文件中定義你的路由(而不是臨時抱佛腳他們都爲一個路由/ index.js文件),你可以建立路由的hackish的方式對象(如下):

var express = require('express') 
    , routes = { 
     index: require('./routes').index 
    , events: require('./routes/events.js').events 
    } 
    , hbs = require('hbs'); 

注意:您不需要需要 express和hbs的定義(第一行和最後一行)在那裏,我只是把它放在那裏給你一點上下文。這段代碼片段直接來自我的app.js文件的頂部。

請注意.index.events鏈接到require()函數調用。這是關鍵。我events.js文件只有一個出口(事件):

exports.events = function(req, res){ 
    console.log('in events'); 
    res.render('events', { events: events, title: "EVENTS" }); 
    console.log('events done'); 
}; 

由於require()功能基本上抓住一個文件,並要求(進口)任何非私有瓦爾(也就是那些附着在特殊exports對象)並將它們暴露給包含require()調用的文件,我只需從包含require()調用的文件中獲取我要求的特定功能即可。如果我在需要的文件中定義多個出口,我想我可以抓住他們像這樣(沒有測試):

routes = { 
    index: require('./routes').index 
    , events: require('./routes/events.js').events 
    , favorites: require('./routes/events.js').favorites 
    , upcoming: require('./routes/events.js').upcoming 
} 

我懷疑這會給某人一堆的NodeJS或MVC的經驗,如果動脈瘤他們閱讀你的代碼(我敢打賭它會包含3次相同的文件,但我不太確定)。也許更好的事:

routes = { 
    index: require('./routes').index 
    , events: require('./routes/events.js').events 
    , favorites: require('./routes/favorites.js').favorites 
    , upcoming: require('./routes/upcoming.js').upcoming 
} 

否則,爲什麼不推他們所有的指數?雖然不能肯定,這只是我第二天與節點和任何相關的技術工作...

還可能會幫助你,如果你扔一個的console.log陳述你的VAR聲明之後:

console.log(routes); 
+0

+1「但後來記得這是所有」只是JavaScript「,並能夠糊塗一個答案。」 !神話般的回答:) – 2013-01-11 08:33:54

+0

「模塊在第一次加載後被緩存」http://nodejs.org/api/modules.html#modules_caching – 2013-09-04 20:29:05

3

routes/index.js文件工作的原因和您的routes/join.js不是因爲Node的模塊加載規則。查看文檔modules/folders as modules

它表示它會嘗試按順序加載這些文件。 package.jsonindex.js,index.node

您可以通過在目錄中創建一個package.json文件來更改它加載的文件。將main屬性設置爲新文件的名稱。

如何使路線以您想要的方式工作的一個例子是another question

0

如果你只說

var routes = require('./routes') 

默認情況下,節點將開始尋找索引文件(無論是index.js或index.node)。如果你想使用你的加入文件,你需要明確地說:

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

現在我認爲join.join應該工作。

0

有類似的問題。

只有我的「/」路線工作。 當試圖創建「/約」我會得到一個404錯誤。

原來當我用快遞發電機它寫道:

app.use('/about', ...etc) 

相反,它應該是:

app.all('/about', ...etc) 

我知道它不是完全一樣的問題,但是這是爲流浪狗誰發現自己在這裏尋找同樣的問題,以「唯一索引作品...」的問題。