在REST Apis中处理错误情况的有效方法

时间:2015-07-07 20:14:36

标签: node.js rest hapijs

我正在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);
           }
      }
});

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

3 个答案:

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