nodejs ExpressJS路由只适用于索引

我有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

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

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

这工作。

任何想法我在这里做错了吗?

谢谢!

我有一个类似的问题,但后来记得这是所有“只是JavaScript”,并能够糊涂一个答案。

如果你想在多个文件中定义你的路由(而不是将它们全部填充到一个routes / index.js文件中),你可以用一种诡异的方式构buildroutes对象(如下所示):

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

注意:你不需要 express和hbs定义(第一行和最后一行),我只是把它放在那里给你一个上下文。 这个代码片段直接来自我的app.js文件的顶部。

注意链接到require()函数调用的.index.events 。 这是关键。 我的events.js文件只有一个导出(事件):

 exports.events = function(req, res){ console.log('in events'); res.render('events', { events: events, title: "EVENTS" }); console.log('events done'); }; 

由于require()函数本质上是抓取一个文件,并要求(导入)任何非私有variables(即那些附加到特殊exports对象的variables)并将它们暴露给包含require()调用的文件,所以我能够只需从包含require()调用的文件中获取我要求的特定函数即可。 如果我在需要的文件中定义了多个导出,我想我可以像这样抓取它们(还没有testing过):

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

我怀疑,如果他们读了你的代码(我敢打赌,它将包括3次相同的文件,但我不太确定),会给一些有nodeJS或MVC的人带来动脉瘤。 也许最好做:

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

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

也可能会帮助你,如果你抛出一个console.log声明后你的var声明:

 console.log(routes); 

route / index.js文件工作的原因和您的routes / join.js不是因为Node的模块加载规则。 查看模块/文件夹的文档作为模块

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

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

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

我testing了一个类似的情况,它为我工作。

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

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

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

如果你只是说

 var routes = require('./routes') 

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

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

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

有类似的问题。

只有我的“/”路线工作。 当试图创build“/约”我会得到一个404错误。

当我使用快递发生器时发现它写道:

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

相反,它应该是:

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

我知道它不是完全相同的问题,但这是为了find自己在这里寻找同样的问题,“唯一索引作品…”问题的stream浪者。