12

I have routes in separate folder for expressjs. The setup is working fine for the 'index' page, but not for any additional routes.

This is my index.js, inside my routes folder.

 module.exports = function(db) {

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

This is my join.js, inside my routes folder.

 module.exports = function(db) {

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

In my app.js, I define my routes like this:

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

When I go to http://localhost:3000 but when I go to http://localhost:3000/join i get Cannot GET /join

If I define my route for join like this:

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

This works.

Any idea what I'm doing wrong here?

Thank you!

4

5 回答 5

6

我遇到了类似的问题,但后来想起这都是“只是 javascript”,并且能够混淆答案。

如果你想在多个文件中定义你的路由(而不是将它们全部塞进一个 routes/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
}

否则,为什么不把它们全部放在索引中呢?不过不太确定,这只是我使用 Node 及其任何相关技术的第二天......

如果您在 var 声明之后立即抛出 console.log 语句,也可能会对您有所帮助:

console.log(routes);
于 2012-04-10T21:12:20.597 回答
3

routes/index.js 文件有效而您的 routes/join.js 文件无效的原因是 Node 的模块加载规则。查看模块/文件夹的文档作为模块

它说它将尝试按顺序加载这些文件。package.json, index.js, index.node.

您可以通过在目录中创建 package.json 文件来更改它加载的文件。将main属性设置为新文件的名称。

如何使路线以您想要的方式工作的一个例子是另一个问题

于 2012-04-21T18:09:27.997 回答
0

如果你只是说

var routes = require('./routes')

默认情况下,节点会开始寻找索引文件(无论是 index.js 还是 index.node)。如果你想使用你的加入文件,你需要明确地说出来:

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

现在我认为 join.join 应该可以工作。

于 2014-04-03T18:46:06.393 回答
0

我测试了一个类似的场景,它对我有用。

我猜这个错误可能在你的 routes.js 文件中。你可能正在做:

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

也许你忘记调用for的方法join,只是在做require(./join)。只是一个猜测。

于 2012-04-04T07:39:35.830 回答
0

有类似的问题。

只有我的“/”路线有效。当尝试创建“/about”时,我会收到 404 错误。

结果当我使用 express-generator 时它写道:

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

相反,它应该是:

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

我知道这不是完全相同的问题,但这适用于那些发现自己在这里寻找与“唯一索引有效......”问题相同的问题的流浪者。

于 2016-09-06T19:42:59.937 回答