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.json
, index.js
, index.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浪者。