我打算如何在swaggerize-express中使用handler和dataProvider?

时间:2017-01-10 11:15:40

标签: node.js express swagger

我编写了第一个Swagger规范并使用generator-swaggerswagerize-express)生成了服务器存根。对于每个路径,我得到一个处理程序和一个dataProvider。 我的问题是我打算如何使用这些?

对于具体问题:如何更改以下代码,以便在数据库中查找用户并返回200(如果找到)或404如果找不到?

为处理程序生成的代码:

 get: function getUser(req, res, next) {
        /**
         * Get the data for response 200
         */
        var status = 200;
        var provider = dataProvider['get']['200'];
        provider(req, res, function (err, data) {
            if (err) {
                next(err);
                return;
            }
            res.status(status).send(data && data.responses);
        });
    }

生成的dataProvider代码:

get: {
    200: function (req, res, callback) {
        /**
         * Using mock data generator module.
         * Replace this by actual data for the api.
         */
        Mockgen().responses({
            path: '/users/{id}',
            operation: 'get',
            response: '200'
        }, callback);
    },
    404: function (req, res, callback) {
        /**
         * Using mock data generator module.
         * Replace this by actual data for the api.
         */
        Mockgen().responses({
            path: '/users/{id}',
            operation: 'get',
            response: '404'
        }, callback);
    }
}

我知道我可以在处理程序中查找数据库。但这不是dataProvider的目的吗?

2 个答案:

答案 0 :(得分:1)

我也很困惑。你找到了解决方案吗?我发现我可以使用提供的callback在肯定的情况下(即找到数据库项目时)发送响应。

var id = req.params.id;
// item = ... get your data base item via id ...
callback(null, { responses: item });

我仍然想知道在负面情况下哪些参数传递给callback。我试着打电话给callback(404),表示我希望服务器提供一个"资源未找到"响应。但是,这会导致HTTP-500错误。

答案 1 :(得分:0)

我想分享一下我决定如何构建我的应用程序。但是,我很想知道你是否找到了一种更有效的方法。以下是我的基本概念:

  • handler - 应管理所有与路由相关的逻辑,意味着参数和属性验证以及路由到正确的dataProvider
  • dataProvider - 应管理与模型层/数据库的交互。如果控制器最终不是正确的dataProvider,则将控制权传递回处理程序。

<强>处理程序/用户/ {ID}的.js

get: function getUser(req, res, next) {
  var status = 200;
  var provider = dataProvider['get']['200'];

  // Check if params.id is a valid integer
  // If not, get response from dataProvider['get']['400']
  if (isNaN(req.params.id)) {
    status = 400;
    provider = dataProvider['get']['400'];
    provider(req, res, function(err, data) {
      if (err) {
        return next(err);
      }
      res.status(status).send(data && data.responses)
    });
    return;
  }

  provider(req, res, function(err, data) {
    if (err) {
      return next(err);
    }
    // Check if user with id exists
    // If not, get response from dataProvider['get']['404']
    if (!data) {
      status = 404;
      provider = dataProvider['get']['404'];
      provider(req, res, function(err, data) {
        if (err) {
          return next(err);
        }
        res.status(status).send(data && data.responses)
      });
      return;
    }
    res.status(status).send(data && data.responses);
  });
}

数据/用户/ {ID}的.js

get: {
  200: function(req, res, callback) {
    User.find({
      where: {
        id: req.params.id
      }
    }).then(function(object) {
      if (!object) {
        return callback(null, null);
      }
      callback(null, {
        responses: object.toJSON()
      });
    });
  },
  400: function(req, res, callback) {
    callback(null, {
      responses: ERR.USER.INVALIDID
    });
  },
  404: function(req, res, callback) {
    callback(null, {
      responses: ERR.USER.NOTFOUND
    });
  }
},

我认为它看起来好像是为了很好地分离责任。我不确定这种模式是否来自其他框架/语言,但我找不到很多在线支持这一点。你觉得怎么样?