app.put('url',middleware)不运行中间件Express NodeJs

时间:2017-05-23 16:05:41

标签: node.js express middleware

我有一些中间件可以验证所有put和post请求是否具有适当的参数。我的mocha测试失败了我的更新路由,调试后我已经看清了它因为我的路由器没有通过我的验证中间件获取更新请求,虽然它适用于所有帖子并且我在同一个地方安装了中间件和时间,以同样的方式。谁能发现这个问题?您可以在下面找到我的测试代码,验证中间件以及我安装路由的位置。

在server.js中:

//400 middleware

//this mounts the middleware succesfully
app.post('/:table', helper.validateParameters);

//this doesn't
app.put('/:table', helper.validateParameters);

在我的测试文件中:

it('should return a 400 error if no parameters are passed', (done) =>{

debugger;

//this runs through the validation middleware
  request(app)
  .post('/item/')
  .set('Authorization', testSuite.tokenHeader)
  .expect(400)
  .end(done);
});

...

it('should return a 400 error if no parameters are passed', (done) => {

debugger;

//this doesn't
  request(app)
  .put(testSuite.realItemUrl)
  .set("Authorization", testSuite.tokenHeader)
  .expect(400)
  .end(done);
});

在helper.js中:

let validateParameters = (req, res, next) => {

  debugger;

  //The route handler never enters here when handling Item.put requests

  if (!checkProperties(req.params.table, req.body.params)) {
    //winston.log?
    return next(ErrorTypes.badRequest());
  }
  else {
    return next();
  }

 }

...

let checkProperties = (table, params) => {

  if (!params) {
    return false;
  }

  var requiredProperties = [];

  switch(table) {
    case 'item':
      requiredProperties = Object.keys(Item.schema.obj);
      break;
    case 'match':
      requiredProperties = Object.keys(Match.schema.obj);
      break;
    case 'user':
      requiredProperties = Object.keys(User.schema.obj);
      break;
  }

  return Object.keys(params).every( parameter => {
    return requiredProperties.includes(parameter);
  });
}

1 个答案:

答案 0 :(得分:1)

解决!我最初为这样的put请求安装了我的验证中间件:

app.put("/:table", helper.validateParameters);

但我用来测试的网址是" localhost:3000 / match / 5879234c3232"在"匹配/"之后的所有内容是我的testMatch的_id。因此,我的测试网址没有与通过验证中间件的请求进行模式匹配,因此中间件从未被命中。一个简单的修复调整我安装我的中间件的网址使一切顺利作为黄油:

app.put("/:table/:id", helper.validateParameters);

感谢所有提供意见的人。