【问题标题】:Efficient way to handle error cases in REST Apis在 REST API 中处理错误情况的有效方法
【发布时间】:2015-07-08 05:32:29
【问题描述】:

我正在 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 条件来解决这个问题。但我只是想知道是否有开发人员使用的标准或更有效的方法

【问题讨论】:

    标签: node.js rest hapijs


    【解决方案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' ] } }
    

    【讨论】:

    • 谢谢。看起来不错。我现在无法对其进行测试,但这是否允许仅传递参数 a&b 之类的情况。如果没有传递参数,它会返回 400 吗?很抱歉,我目前无法亲自测试:(
    • 是的,可以使用 Joi 进行任何类型的验证。如果没有传递参数,上面的代码将不会返回 400,但可以将 Joi 配置为在这种情况下返回 400。你的问题有点太笼统了。我建议查看 Joi 的文档并尝试创建验证模式。如果您遇到问题,请打开另一个问题并列出哪些案例有效,哪些案例无效。
    【解决方案2】:

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

    【讨论】:

      【解决方案3】:

      也许您应该考虑使用一个框架,例如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');
      });
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2020-05-09
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2023-03-23
        • 2021-05-25
        • 2020-11-18
        相关资源
        最近更新 更多