Node.js 在RESTAPI中处理错误情况的有效方法
我正在node.js中编写RESTAPI。我希望GET请求中最多有5个参数。如果有未识别的参数,我希望发送400个错误请求。 目前我的处理方式如下:Node.js 在RESTAPI中处理错误情况的有效方法,node.js,rest,hapijs,Node.js,Rest,Hapijs,我正在node.js中编写RESTAPI。我希望GET请求中最多有5个参数。如果有未识别的参数,我希望发送400个错误请求。 目前我的处理方式如下: server.route({ method: "GET", path : "/test", handler : function (request, reply) { if (request.query.a || request.query.b || request.query.c ||
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);
}
}
});
目前,如果存在一些有效和无效的案例,则这不适用于该案例。我可以通过使用更多的if条件来解决这个问题。但我只是想知道是否有一种标准或更有效的方法供开发人员使用您可以手动执行此操作,但最好使用诸如mongoose或loopback(strongloop)之类的REST框架要进行验证和错误处理以及其他类似模型绑定的样板代码。< P>也许你应该考虑使用框架,比如使用一个简单的代码,你可以在不同的路径上重用。 一个简单的伪/示例如下所示
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');
});
Hapi具有内置的验证支持。您可以使用来验证查询:
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' ] } }
谢谢看起来很棒。我现在无法测试它,但这是否允许只传递参数a和b之类的情况。如果没有传递任何参数,它会返回400吗?很抱歉,我目前无法亲自测试:(是的,可以使用Joi进行任何类型的验证。如果没有传递参数,上述代码将不会返回400,但在这种情况下,可以将Joi配置为返回400。您的问题有点过于宽泛。我建议查看Joi的文档并尝试创建验证架构。如果遇到问题,请打开o回答问题并列出哪些案例有效,哪些案例无效。