javascript - nodejs ExpressJS 路由仅适用于索引

标签 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/加入

如果我这样定义我的加入路线:

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

这行得通。

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

谢谢!

最佳答案

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

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

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

注意:你不需要里面的 express 和 hbs 定义(第一行和最后一行),我只是把它放在那里给你一点上下文。此代码片段直接来 self 的 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() 函数本质上是抓取一个文件并需要(导入)任何非私有(private)变量(即附加到特殊 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);

关于javascript - nodejs ExpressJS 路由仅适用于索引,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10000837/

相关文章:

javascript - 将变量附加到 HTML 元素?

JavaScript,使用替换

javascript - 具体网址路径

javascript - 无法 GET/blah.html - .ejs 无法加载 html?

javascript - 从 SignaturePad 导出不带透明背景的图像

javascript - React Native 图像不可见

node.js - 在 Node.js 中使用 cassandra-driver 通过 SSL 连接到 Cassandra Apache

node.js - Passport 本地 Mongoose 错误: No Username Was Given

node.js - 即使将 nodeIntegration 设置为 true,Electron window.require 也不是函数

node.js - Node JS 和 Express JS 的 HTTPS 请求速度慢?