Node.js 通过节点中的Express中间件跟踪HTTP GET请求的路径
我正在尝试调试我的应用程序,在调试过程中,我意识到我不完全理解HTTP GET请求是如何到达路由的。换句话说,当我们像这样配置中间件时:Node.js 通过节点中的Express中间件跟踪HTTP GET请求的路径,node.js,mongodb,express,passport.js,Node.js,Mongodb,Express,Passport.js,我正在尝试调试我的应用程序,在调试过程中,我意识到我不完全理解HTTP GET请求是如何到达路由的。换句话说,当我们像这样配置中间件时: app.configure(function(){ // options app.set('port', process.env.PORT || 3000); app.set('views', __dirname + '/views'); app.set('view engine', 'jade'); // middleware ap
app.configure(function(){
// options
app.set('port', process.env.PORT || 3000);
app.set('views', __dirname + '/views');
app.set('view engine', 'jade');
// middleware
app.use(express.favicon());
app.use(express.logger('dev'));
app.use(express.cookieParser('your secret here'));
app.use(express.bodyParser());
app.use(express.methodOverride());
app.use(express.session());
app.use(passport.initialize());
app.use(passport.session());
app.use(app.router);
app.use(require('less-middleware')({ src: __dirname + '/public' }));
app.use(express.static(path.join(__dirname, 'public')));
});
任何类型的每个HTTP请求都是通过中间件分阶段提供的,对吗
我遇到的问题是,在我的中间件中的某个地方,我的数据库中的users集合被查询,req.user被错误的用户文档填充,我很难找出可能发生这种情况的地方。我知道我的中间件是罪魁祸首,但此时我的调试能力开始让我失望。任何帮助都将不胜感激
编辑:
这是我的护照设置:
passport.use(new LocalStrategy(function( username, password, done ) {
models.User.authenticate( username, password, function( err, user) {
// reports CORRECT user
console.log('\nmodels.User.authenticate callback');
console.log('--username is ' + user.username);
console.log(util.inspect(user));
// return done( err, user );
return done( err, user);
});
}));
passport.serializeUser(function( user, done ) {
// reports CORRECT user
console.log('\npassport.serializeUser');
console.log('--username is ' + user.username);
console.log('--user._id is ' + user._id);
console.log(util.inspect(user));
done(null, user._id);
});
passport.deserializeUser(function(id, done) {
// reports CORRECT user id
console.log('\npassport.deserializeUser()');
console.log('user._id is ' + id);
models.User.findOne( id, function (err, user) {
done(err, user);
});
});
serializeUser和deserializeUser似乎按预期工作。他们在登录时都报告了正确的凭据。Passport设置在我看来还可以。不正确的用户总是相同的,还是只是随机的?此外,您似乎没有使用会话存储,这意味着每次应用程序重新启动时会话都会重置,尽管我认为这不会导致您的问题。顺便说一句,要跟踪中间件工作流,如果您使用的是Unix ish操作系统,则可以使用env DEBUG=connect:dispatcher node yourapp.js。错误的用户始终是数据库中的第一个用户。换句话说,如果我们从一个空白数据库开始并注册了几个用户,那么不管发生什么,唯一登录的用户就是第一个注册的用户。我使用WireShark查看查询何时返回错误的用户,以及重定向到get/user之后,在用户的凭据通过Passport验证后。我猜Passport会话策略中的某个地方进行了一些数据库调用,但我很难理解这一点。。。这是数据库不可知论,对吗?那么,它或任何其他中间件如何查询我的数据库呢?deserializeUser进行数据库调用:每个请求都会调用它,并获取存储在会话id中的值,将其转换为用户对象。这假设_id对于一个用户来说总是唯一的,但由于您使用的是MongoDB,所以很可能是唯一的。我已经花了很长时间追踪那个虫子了。非常感谢你。