Node.js 在RESTAPI中处理错误情况的有效方法

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 ||

我正在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 || 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回答问题并列出哪些案例有效,哪些案例无效。