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

Efficient way to handle error cases in REST Apis

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

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

您可以手动执行此操作,但最好使用 REST 框架,如 mongoose 或 loopback (strongloop) 来执行验证和错误处理以及模型绑定等其他样板代码。

也许您应该考虑使用框架,例如 Express, to use a middleware,它只是您可以在不同路径中重复使用的代码。

一个简单的pseudo/example看起来像这样

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 具有内置的验证支持。您可以使用 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' ] } }