app.get不适用于基本路线

时间:2014-10-06 09:19:01

标签: javascript node.js express

我是node.js的绝对新手,我尝试通过这项技术创建一个新项目。我使用快速框架,但一开始我有点麻烦。我用解决方法解决了这个问题,但我对下一个行为有疑问: 我的 app.js

var express = require('express')
  , routes = require('./routes/index')
  , routes = require('./routes/login');

var app = module.exports = express.createServer(); 
console.log(app.env);
// Configuration

app.configure(function(){
  app.set('views', __dirname + '/views');
  app.set('view engine', 'ejs');
  app.use(express.bodyParser());
  app.use(express.methodOverride());
  app.use(app.router);
  app.use(express.static(__dirname + '/public'));
});


app.configure('development', function(){
  app.use(express.errorHandler({ dumpExceptions: true, showStack: true }));
});

app.configure('production', function(){
  app.use(express.errorHandler());
});

// Routes

app.use( function(req, res, next) {
    if (req.url == '/') {
        res.render('index', { title: 'Express!' })
    } else {
        next();
    }
});
//app.get('/', routes.index);

app.get('/login', routes.login);


app.listen(3000, function(){
  console.log("Express server listening on port %d in %s mode", app.address().port, app.settings.env);
});

在块 //路线中,您可以看到 app.use app.get 。如果我尝试使用 app.get 而不是 app.use ,我会收到错误"无法获取/" 。我试图将index.html文件放到我的公用文件夹中。但是对于" /"路由我每次都得到这个文件,而不是index.js的渲染。

app.get(' / login',routes.login); - 工作正常,但是" /"路线。我不想让我的代码保持这种状态,请帮助我理解这种行为。

提前感谢。

1 个答案:

答案 0 :(得分:2)

与用户PA一样。提到,你的代码永远不会找到/网址的原因是因为你正在重新声明你的路由变量:

var express = require('express')
  , routes = require('./routes/index')  // first declaration of 'routes'
  , routes = require('./routes/login'); // re-declaration of 'routes'

这使得您的第一个路由声明(指向/ index的声明)无法通过您的代码访问,这就是您收到错误“无法获取/”的原因,因为您的路由变量仅指向./routes/login。

有几种方法可以解决这个问题,以清理代码:

<强> 1。为不同的路线分配不同的变量:

var express = require('express')
    , index = require('./routes/index')  
    , login = require('./routes/login');

- 0R -

<强> 2。将多个函数放在路径文件中:

// ~~~~~~~~~~~~~~~~~~~~~~~~~~~
// in your routes/index file

exports.index = function(req, res){
   res.render('index', { title: 'Index Page' });
};

exports.login = function(req, res){
   res.render('login', { title: 'Login Page' });
};


// ~~~~~~~~~~~~~~~~~~~~~~~~~~~
// in your app.js file

// import your 'routes' functions from your 'routes' file 
var express = require('express')
      , routes = require('./routes/')  


// now use your routes functions like this:
app.get('/', routes.index);
app.get('/login', routes.login);

- 或 -

在大型应用程序中,或者为了更好的代码可维护性,您可能希望将不同的路由功能分解为不同的文件(而不是将所有路由功能放在一个文件中,如上例所示),因此使用express default以设置为例,他们将user函数及其index函数放在routes文件夹中,如下所示:

routes /
   user.js
   index.js

然后,他们设置了这样的应用程序:

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

并调用这些函数:

app.get('/', routes.index); // calls the "index" function inside the routes/index.js
app.get('/users', user.list); // calls the "list" function inside the routes/user.js file

希望这有帮助。

快速提示:app.use()用于创建中间件,这是一个将在应用程序中的每个请求上调用的函数,使您(开发人员)可以访问请求对象req,以及响应对象res,以及以某种方式更改或增强应用程序的能力。 “在请求中间行动”的功能是一个强大的功能,它在原始示例中为您工作的原因是因为app.use()中间件在/请求时被调用正在调用,即使您的应用找不到/,当您重新声明routes变量时丢失了,但您仍在向/发出请求, app.use()能够看到(因为中间件在每个请求上被调用,甚至是“坏”的),所以你的中间件仍然看到[{1}}的[invalid]请求,并且这样做:

/