nodejs ExpressJS路由仅适用于索引

时间:2012-04-03 20:24:59

标签: javascript node.js express

我在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');
 });

这很有效。

知道我在这里做错了吗?

谢谢!

5 个答案:

答案 0 :(得分:6)

我遇到了类似的问题,但后来记得这只是“只是javascript”而且能够扼杀答案。

如果你想在多个文件中定义路由(而不是将它们全部塞入一个routes / index.js文件中),你可以用hackish方式构建routes对象(如下所示):

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对象的变量)并将它们暴露给包含{的文件{1}}调用,我能够从require()调用中包含的文件中获取我需要的特定函数。如果我在所需文件中定义了多个导出,我想我可以像这样抓取它们(尚未测试):

require()

我怀疑如果他们阅读你的代码,这会给一群nodeJS或MVC的人带来动脉瘤(我打赌它会包含3次相同的文件,但我不太确定)。也许更好的做法:

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

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

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

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

答案 1 :(得分:3)

routes / index.js文件工作的原因和您的路由/ join.js不是因为Node的模块加载规则。查看modules/folders as modules

的文档

它说会尝试按顺序加载这些文件。 package.jsonindex.jsindex.node

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

如何使路线以您想要的方式运作的示例是another question

答案 2 :(得分:0)

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

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

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

也许您忘记拨打join的方法,只做require(./join)。 只是一个猜测。

答案 3 :(得分:0)

如果你只是说

var routes = require('./routes')

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

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

现在我认为join.join应该可行。

答案 4 :(得分:0)

有类似的问题。

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

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

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

相反应该是:

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

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