2012-04-03 100 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) 

我知道它不是完全一样的问题,但是这是为流浪狗谁发现自己在这里寻找同样的问题,以“唯一索引作品...”的问题。