我只是在ExpressJS中尝试基本路由,到目前为止我有两条路线:
app.get('/', function(req,res) {
res.render('index');
});
app.get('/pics', function(req,res) {
res.render('pics');
});
当这样定义时,在我的app.js中,一切正常,但是当我从routes
子目录中的单个文件导出如下时,我得到的错误信息是预期的回调函数,但是返回了对象undefined。
index.js:
exports.index = function(req,res) {
res.render('index');
});
pics.js
exports.pics = function(req, res) {
res.render('pics');
};
app.js
var routes = require('./routes');
app.get('/', routes.index);
app.get('/pics', routes.pics);
在后一个例子中我做错了什么来打破一切?
答案 0 :(得分:1)
require('./routes')
仅加载./routes/index.js
,而不是./routes/pics.js
。所以routes.pics
将是未定义的。
答案 1 :(得分:1)
索引路由正在运行,但您的图片路由不是因为您尝试从index.js导入它。
路径目录有index.js,这意味着如果你执行require('./route')
,你实际上正在进行require('./route/index')
。发生这种情况是因为index.js在Node.js中具有特殊含义。
因此,为了让照片得以实现,您需要这样做:
app.get('/pics', require('./routes/pics').pics);
这可能会让人感到困惑,这是一个在IRC频道上被问到很多的问题。
答案 2 :(得分:0)
require()会尝试加载index.js。
这是一个小的coffeescript片段,您可以在index.js中粘贴(将其转换为js)。它将自动加载当前目录中的所有文件(路由):
<强> index.coffee 强>
module.exports = (app) =>
require("fs").readdirSync(__dirname).forEach (file) ->
i = file.lastIndexOf('.')
ext = if (i < 0) then '' else file.substr(i)
if (ext == ".js" or ext == ".coffee") and file != "index"+ext
require("./" + file)(app)
<强> app.js 强>
require("./routes")(app)
<强> someRoutes.js 强>
app.get('/', function(req,res) {
res.render('index');
});