0

我只是在 ExpressJS 中试验基本路由,到目前为止我有两条路由:

app.get('/', function(req,res) {
  res.render('index');
});

app.get('/pics', function(req,res) {
  res.render('pics');
});

当像这样定义时,在我的 app.js 中,一切正常,但是当从我的子目录中的单个文件导出如下时routes,我收到错误消息,指出需要回调函数,但返回了未定义的对象。

index.js:

exports.index = function(req,res) {
  res.render('index');
});

图片.js

exports.pics = function(req, res) {
  res.render('pics');
};

应用程序.js

var routes = require('./routes');

app.get('/', routes.index);
app.get('/pics', routes.pics);

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

4

3 回答 3

1

require('./routes')只加载./routes/index.js,不加载./routes/pics.js。所以routes.pics将是未定义的。

于 2013-02-22T19:13:21.043 回答
1

index 路由正在运行,但您的 pics 路由不是因为您尝试从 index.js 导入它。

路由目录有 index.js,这意味着如果你这样做,require('./route')你实际上是在做require('./route/index'). 发生这种情况是因为 index.js 在 Node.js 中具有特殊含义。

因此,要使图片正常工作,您需要执行以下操作:

app.get('/pics', require('./routes/pics').pics);

这可能真的很令人困惑,并且是 IRC 频道上经常被问到的一个问题。

于 2013-02-22T19:14:46.160 回答
0

require()将尝试加载 index.js。

这是一个小的咖啡脚本片段,您可以将其粘贴(将其转换为 js)到 index.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)

应用程序.js

require("./routes")(app)

someRoutes.js

app.get('/', function(req,res) {
  res.render('index');
});
于 2013-02-22T19:10:09.987 回答