我正在node.js中编写REST API。我希望最多5个参数可以到达我的GET请求。如果有未识别的参数,我希望发送400 Bad Request。 目前我正在以下列方式处理它:
server.route({
method: "GET",
path : "/test",
handler : function (request, reply) {
if (request.query.a || request.query.b || request.query.c || request.query.d || request.query.e)
{
// do some processing
}
else {
reply("No valid parameters").code(400);
}
}
});
现在,如果存在一些有效和一些无效的情况,则不会处理此情况。我可以通过使用更多条件来解决这个问题。但我只是想知道开发人员是否使用标准或更有效的方法
答案 0 :(得分:1)
Hapi拥有内置的验证支持。您可以使用Joi来验证查询:
var Joi = require('joi');
...
server.route({
method: 'GET',
path: '/test',
config: {
validate: {
query: {
a: Joi.string(),
b: Joi.string(),
c: Joi.string(),
d: Joi.string(),
e: Joi.string()
}
}
},
handler: function (request, reply) {
return reply('ok');
}
});
如果您向/test?g=foo
发送请求,则会收到以下回复:
{ statusCode: 400,
error: 'Bad Request',
message: '"g" is not allowed',
validation: { source: 'query', keys: [ 'g' ] } }
答案 1 :(得分:0)
您可以手动执行此操作,但最好使用像mongoose或loopback(strongloop)这样的REST框架来执行验证和错误处理以及模型绑定等其他样板代码。
答案 2 :(得分:0)
也许您应该考虑使用Express之类的框架来使用middleware,这只是您可以在不同路径中重复使用的代码。
一个简单的伪/示例看起来像这样
var app = express();
// a middleware with no mount path; gets executed for every request to the app
app.use(function (req, res, next) {
if (req.query.a && req.query.b) {
return next()
}
else {
return res.status(400).send('Not OK');
}
});
// a route and its handler function (middleware system) which handles GET requests to /user/:id
app.get('/user/:id', function (req, res, next) {
return res.send('OK');
});
// a different route, same middleware
app.get('/customer/:id', function (req, res, next) {
return res.send('OK');
});