有效的方式来处理REST Apis中的错误情况

我在node.js中编写了一个REST API。 我期望最多5个参数到达我的GET请求。 如果有不明身份的参数,我希望发送400错误的请求。 目前我正在以如下方式处理:

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); } } }); 

现在,如果有一些有效的和一些无效的情况下,这不处理案件。 我可以通过使用更多的条件来解决这个问题。 但我只是想知道是否有一个标准或更有效的方法是由开发人员使用

Hapi有内置的validation支持。 您可以使用Joi来validation查询:

 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' ] } } 

您可以手动执行此操作,但最好使用像mongoose或loopback(strongloop)这样的REST框架来执行validation和error handling以及其他样板代码(如模型绑定)。

也许你应该考虑使用像Express这样的框架来使用一个中间件 ,这个中间件就是你可以在不同路由中重用的代码。

一个简单的伪/例子看起来像这样

 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'); });