2012-10-06 22 views
1

Express中有很奇怪的行为,无法弄清楚,头脑开裂问题。Nodejs/Express POST请求中间件无法在回调中调用next()

因此假设在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过程称为请求它只是挂起,但谁可以解释我为什么???

原来的问题带给我的是当我试图使用passport.js反序列化程序从mongodb中为每个请求读取用户,因此对于仅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()); 
}); 
+0

听起来像这个问题可能是在客户端与您生成您的POST请求的方式。 – JohnnyHK

+0

不,事实并非如此,在常规形式的帖子和ajax帖子的情况下会失败,无所谓。 – kingpin

回答

4

我不知道这会产生作用,但其建议在中间件堆栈较早使用bodyParser中间件。我会把它放在cookieParser以下,护照中间件以上,因为许多认证机制需要在主体中查找参数。

+0

这实际上解决了问题!非常感谢,你可能再救了我一周。你从哪里得到关于中间件顺序的建议? – kingpin

+0

除了确保“依赖”其他中间件的中间件*之后*之外,没有硬性和快速的建议。 'bodyParser'解析body并设置'req.body',并且许多其他中间件期望'req.body'存在。如果这些被挂载在'bodyParser'之上,那么'req.body'将不存在(因为该中间件尚未处理该请求)并且它们的要求不被满足。 –

+0

有同样的问题,改变bodyParser的位置固定它。 – Alex