express.js app.use(函数理解问题

时间:2013-12-04 04:19:15

标签: node.js express

首先,我想说的是,无论语言是什么,我都是初学者,其次,我正在尝试所有的javascript + node.js以及所有的框架/模块,因为它有一周的时间。

到目前为止,我能够在StackOverflow的帮助下找到并修复我的所有问题,但这一次,我陷入困境,真的无法弄清楚为什么;可能是一些noob原因或更深层次的东西。

我正在尝试为网站制作一些基本功能,现在我正在研究一个简单的身份验证代码,所以我想将一些客户端数据保存到会话变量中;我已经看到了一些例子,你首先要检查是否定义了会话变量,如果没有,那么这样做。

这里是示例代码:

.use(function(req, res, next){
  if (typeof(req.session.todolist) == 'undefined') {
    req.session.todolist = [];
  }
  next();
})

我想改为:

.use(function(req, res, next) {
  if (typeof(req.session.auth) == 'undefined') 
    req.session.auth = false;
  next();
})

但事实并非如此,变量保持未定义。

它处理了我制作的另一个测试代码,所以问题不是来自这部分,而是更可能来自我的其余代码。

我甚至无法做到这一点:

.use(function(req, res, next) {
  console.log('test');
})

控制台中没有任何内容。

所以我想知道我的代码中的其他内容是否可能会干扰这个或不兼容,因为其他一切都运行良好:

// Setting up requirement
//----------------------------------
var path = require('path'),
    express = require('express'),
    app = express(),
    server = require('http').createServer(app),
    io = require('socket.io').listen(server),
    ent = require('ent'),
    mongoose = require('mongoose'),
    crypto = require('crypto');

// Connection to the database
//----------------------------------
mongoose.connect('mongodb://localhost/alpha');
var db = mongoose.connection;

db.on('error', console.error.bind(console, 'connection error:'));
db.once('open', function callback () {
    db.db.collectionNames(function(error, names) {
        if (error) {
          throw new Error(error);
        } else {
          names.map(function(name) {
            console.log(name);
          });
        }
    });
});


// Setting up express for routing
//----------------------------------
app.set('port', 8080)
.set('views', path.join(__dirname, 'views'))
.set('view engine', 'jade')
.use(express.cookieParser())
.use(express.session({secret: 'xxxx'}))
.use(express.favicon())
.use(express.logger('dev'))
.use(express.bodyParser())
.use(express.methodOverride())
.use(app.router)
.use(express.static(path.join(__dirname, 'public')))

// Client variables
//----------------------------------
.use(function(req, res, next) {
    console.log('test');
})

// Routing
//----------------------------------

// Index -- can be called via / or /index or /home
.get(/^\/(index|home)?$/, function(req, res) {
    res.render('index', {title: 'Home'});
})

// Login
.post('/login', function(req, res) {
    var login = req.body.login,
    password = crypto.createHash('md5').update(req.body.password, 'utf8').digest('hex'),
    loginT = 'aaa',
    passwordT = crypto.createHash('md5').update('zzz', 'utf8').digest('hex');

    if(password == passwordT) 
        res.send({error: false});
    else
        res.send({error: true});
})

// Starting up the server
//----------------------------------
server.listen(app.get('port'), function() {
  console.log('Express server listening on port ' + app.get('port'));
});

我真的无法弄清楚这里的问题是什么,其余的代码再次完美无缺,无论是mongoose还是express部分(还没有测试socket.io还有这个代码)。

提前致谢..

1 个答案:

答案 0 :(得分:1)

将您的功能移至.use(app.router)以上的某个位置。

解释:

  • Express按照添加到应用程序的顺序调用中间件(app.use函数),直到某些内容无法调用next()
  • app.router中间件检查匹配的url路由,然后使用该功能,否则调用next()

因此,只有当前网址与任何已定义的路由不匹配时,才会调用任何定义为app.router的中间件。最好将静态文件放在app.router下面,以便命名不佳的文件不会接管正确的URL,但这不是您正在寻找的行为。