我在 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/