从路由目录中的文件导出时,如何才返回我的视图?

时间:2013-02-22 19:03:06

标签: javascript node.js express url-routing

我只是在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);

在后一个例子中我做错了什么来打破一切?

3 个答案:

答案 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');
});