1

Expressには非常に奇妙な動作があり、理解できず、クラッキングの問題が発生します。

それで、req.user私がユーザーIDを持っていて、これが私のミドルウェアコードであると仮定します。

app.use(function(req, res, next){
  var User = mongoose.model('User');
  User.findById(req.user, function(err, user){
    if(err) return next(err);
    res.locals.user = user;
    console.log(user);
    next(); 
  });
}

したがって、リクエストタイプがGETの場合は問題なく機能しますが、リクエストがPOSTの場合は、データが受信されないまで、無限に待機します。

データベースにもセッションにも問題はありませんconsole.log(user)。常に機能します。

これは非常に奇妙です...私は別の非同期関数を使おうとしましたが、POSTのみのリクエストでは再び機能しませんでした。

fs.stat(__dirname + '/schemas/user.js', function(err, stat){
  next();
})

私の結論は、next()POSTリクエスト中にコールバックから呼び出された場合、ハングするだけですが、なぜだれが私に説明できるのでしょうか?

ここで私をもたらした元の問題は、すべてのリクエストに対してmongodbからユーザーを読み取るpassport.jsデシリアライザーを使用しようとしたときに発生したため、POSTのみのリクエストでも失敗します。

構成

{
  "name": "myApp",
  "version": "0.0.1",
  "private": true,
  "scripts": {
    "start": "./node_modules/.bin/nodemon app.js"
  },
  "dependencies": {
    "express": "3.0.0rc5", //did also tried with rc4
    "ejs": ">= 0.8.3",
    "express-partials": "latest",
    "mongodb": ">= 1.1.7",
    "mongoose": "*",
    "node-uuid": "*",
    "passport": "*",
    "passport-local": "*",
    "flashify": "*",
    "nodemon": "latest"
  }
}

エクスプレス構成

var app = express();
app.configure(function(){
  app.set('port', process.env.PORT || 3000);
  app.set('views', __dirname + '/views');
  app.set('view engine', 'ejs');
  app.use(express.logger('dev'));
  app.use(partials());
  app.use(express.cookieParser('Secret secret'));
  app.use(express.session());
  app.use(passport.initialize());
  app.use(passport.session());

  app.use(MY_MIDDLEWARE_HERE);

  app.use(express.favicon());  
  app.use(express.bodyParser());
  app.use(express.methodOverride());
  app.use(flashify);
  app.use(app.router);
  app.use(express.static(path.join(__dirname, 'public')));
});


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

1 に答える 1

4

bodyParserこれが効果があるかどうかはわかりませんが、ミドルウェアスタックの早い段階でミドルウェアを使用することをお勧めします。cookieParser多くの認証メカニズムは本体内のパラメーターを見つける必要があるため、パスポートミドルウェアの上下に配置します。

于 2012-10-06T17:28:15.540 に答える