nodejs ExpressJS路由仅适用于索引

dzm*_*dzm 12 javascript node.js express

我在expressjs的单独文件夹中有路由.设置适用于"索引"页面,但不适用于任何其他路径.

这是我的routes.js,在我的路线文件夹中.

 module.exports = function(db) {

    return {
        index: function(req, res, next) {
            res.send('index');
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

这是我的routes.js,在我的路线文件夹中.

 module.exports = function(db) {

    return {
        join: function(req, res, next) {
            res.send('join');
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

在我的app.js中,我定义了这样的路线:

          var routes = require('./routes')(db);
          app.get('/', routes.index);
          app.get('/join', routes.join);
Run Code Online (Sandbox Code Playgroud)

当我去,http://localhost:3000但当我去,http://localhost:3000/join我得到Cannot GET /join

如果我像这样定义我的连接路线:

 app.get('/join', function(req, res){
     res.send('join 2');
 });
Run Code Online (Sandbox Code Playgroud)

这有效.

知道我在这里做错了吗?

谢谢!

cmc*_*loh 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');
Run Code Online (Sandbox Code Playgroud)

注意:你不需要 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');
};
Run Code Online (Sandbox Code Playgroud)

由于该require()函数基本上抓取一个文件并要求(导入)任何非私有变量(即附加到特殊exports对象的变量)并将它们暴露给包含该require()调用的文件,所以我只能抓住特定的函数I' m要求我通过require()呼叫包含的文件.如果我在所需文件中定义了多个导出,我想我可以像这样抓取它们(尚未测试):

routes = {
    index: require('./routes').index
  , events: require('./routes/events.js').events
  , favorites: require('./routes/events.js').favorites
  , upcoming: require('./routes/events.js').upcoming
}
Run Code Online (Sandbox Code Playgroud)

我怀疑如果他们读了你的代码,这会给一群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
}
Run Code Online (Sandbox Code Playgroud)

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

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

console.log(routes);
Run Code Online (Sandbox Code Playgroud)


mih*_*hai 0

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

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

routes.index = require('./index')(db);
routes.join = require('./join')(db);
Run Code Online (Sandbox Code Playgroud)

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