【问题标题】:nodejs ExpressJS routes only working for indexnodejs ExpressJS 路由仅适用于索引
【发布时间】:2012-04-03 20:24:59
【问题描述】:

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

这行得通。

知道我在这里做错了什么吗?

谢谢!

【问题讨论】:

    标签: javascript node.js express


    【解决方案1】:

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

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

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

    注意:你不需要里面的 express 和 hbs 定义(第一行和最后一行),我只是把它放在那里给你一点上下文。这段代码 sn-p 直接来自我的 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);
    

    【讨论】:

    【解决方案2】:

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

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

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

    another question 上的示例说明了如何使路由按照您想要的方式运行。

    【讨论】:

      【解决方案3】:

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

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

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

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

      【讨论】:

        【解决方案4】:

        如果你只是说

        var routes = require('./routes')
        

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

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

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

        【讨论】:

          【解决方案5】:

          有类似的问题。

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

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

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

          它应该是:

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

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

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 1970-01-01
            • 2016-05-31
            • 2020-07-04
            • 2017-08-28
            • 1970-01-01
            • 2018-04-22
            • 1970-01-01
            • 1970-01-01
            相关资源
            最近更新 更多