Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/node.js/33.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Node.js 通过节点中的Express中间件跟踪HTTP GET请求的路径_Node.js_Mongodb_Express_Passport.js - Fatal编程技术网

Node.js 通过节点中的Express中间件跟踪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

我正在尝试调试我的应用程序,在调试过程中,我意识到我不完全理解HTTP GET请求是如何到达路由的。换句话说,当我们像这样配置中间件时:

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,所以很可能是唯一的。我已经花了很长时间追踪那个虫子了。非常感谢你。