我在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');
});
这很有效。
知道我在这里做错了吗?
谢谢!
答案 0 :(得分: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');
注意:你不需要需要 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');
};
由于require()
函数主要抓取文件并要求(导入)任何非私有变量(即附加到特殊exports
对象的变量)并将它们暴露给包含{的文件{1}}调用,我能够从require()
调用中包含的文件中获取我需要的特定函数。如果我在所需文件中定义了多个导出,我想我可以像这样抓取它们(尚未测试):
require()
我怀疑如果他们阅读你的代码,这会给一群nodeJS或MVC的人带来动脉瘤(我打赌它会包含3次相同的文件,但我不太确定)。也许更好的做法:
routes = {
index: require('./routes').index
, events: require('./routes/events.js').events
, favorites: require('./routes/events.js').favorites
, upcoming: require('./routes/events.js').upcoming
}
否则,为什么不把它们全部推到索引中呢?不太确定,这只是我第二天使用Node及其相关技术......
如果在var声明后立即抛出console.log语句,也可能会有所帮助:
routes = {
index: require('./routes').index
, events: require('./routes/events.js').events
, favorites: require('./routes/favorites.js').favorites
, upcoming: require('./routes/upcoming.js').upcoming
}
答案 1 :(得分:3)
routes / index.js文件工作的原因和您的路由/ join.js不是因为Node的模块加载规则。查看modules/folders as modules
的文档它说会尝试按顺序加载这些文件。 package.json
,index.js
,index.node
。
您可以通过在目录中创建package.json文件来更改它加载的文件。将main
属性设置为新文件的名称。
如何使路线以您想要的方式运作的示例是another question。
答案 2 :(得分:0)
我测试了一个类似的场景,它对我有用。
我猜这个错误可能在您的routes.js文件中。 你可能会这样做:
routes.index = require('./index')(db);
routes.join = require('./join')(db);
也许您忘记拨打join
的方法,只做require(./join)
。
只是一个猜测。
答案 3 :(得分:0)
如果你只是说
var routes = require('./routes')
默认情况下,node将开始查找索引文件(无论是index.js还是index.node)。如果您想使用您的加入文件,您需要明确说出来:
var join = require('./routes/join')
现在我认为join.join应该可行。
答案 4 :(得分:0)
有类似的问题。
只有我的“/”路线有效。 在尝试创建“/ about”时,我会收到404错误。
当我使用express-generator时,它写道:
app.use('/about', ...etc )
相反应该是:
app.all('/about', ...etc )
我知道它不是完全相同的问题,但是对于那些发现自己在寻找同一问题的流浪者来说,“唯一索引有效......”问题。