【发布时间】:2017-05-27 02:00:48
【问题描述】:
我有一些中间件可以验证所有 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);
});
}
【问题讨论】:
-
你检查
testSuite.realItemUrl的值了吗?对于 PUT 请求,您得到什么响应? -
对于我目前正在调试的那个(更新请求中没有发送参数)我得到一个“200 ok”响应。这可能是因为查询使用空参数进行,而 mongo 以“okay”响应,因为它没有改变任何东西。所以操作就像正常更新一样进行,而它应该在中间件处停止。
-
在一个半相关的注释中,我认为您的意思是在您的
validateParameters()中放入req.params.table &&而不是req.body.params &&,因为req.body.params由于!req.body.params ||而已经是真实的。我不确定这是问题的原因。req.body.params设置了吗?如果是这样,checkProperties()应该受到责备吗?你的 body parser 中间件是如何定义的,它是否也适用于 PUT 请求? -
req.body.params 在示例测试中没有设置,没有。在这种情况下,验证中间件应该使第一个“if”语句中的请求失败,但无论如何它都会通过。我将使用我的 checkProperties 代码更新我的问题。我使用“body-parser”包作为我的解析中间件,所以它应该适用于所有请求
-
您的标题说“X 没有发生”,但您没有专门针对 X 发生进行测试,您只是确定 X 没有给您想要的结果。第一步应该是直接在中间件的第一行放置一个调试器或日志,然后跟随它直到你找到它停止执行你期望的操作。根据您的 cmets,您的标题是错误的。
标签: node.js express middleware