【发布时间】:2012-09-27 08:40:21
【问题描述】:
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();
})
我的结论是,如果在 POST 请求期间从回调中调用 next(),它只会挂起,但谁能解释我为什么???
把我带到这里的最初问题是,当我尝试使用 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());
});
【问题讨论】:
-
听起来问题可能出在客户端,与您生成 POST 请求的方式有关。
-
不,不是这样的,普通form post和ajax post都会失败,没关系。
标签: node.js callback express middleware