【问题标题】:Nodejs/Express POST request middleware unable to call next() in callbackNodejs/Express POST 请求中间件无法在回调中调用 next()
【发布时间】: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


【解决方案1】:

我不确定这是否会产生影响,但建议在中间件堆栈的早期使用bodyParser 中间件。我会把它放在cookieParser 之下和护照中间件之上,因为许多身份验证机制需要在正文中查找参数。

【讨论】:

  • 这实际上解决了问题!非常感谢,你可能又救了我一个星期。您从哪里获得有关中间件顺序的建议?
  • 除了确保“依赖”其他中间件的中间件之后之外,没有硬性建议。 bodyParser 解析主体并设置req.body,许多其他中间件期望req.body 存在。如果这些挂载在bodyParser 之上,那么req.body 将不存在(因为该中间件尚未处理请求)并且它们的要求不满足。
  • 遇到了同样的问题,改变bodyParser的位置就解决了。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多