Node.js 我打算如何在swaggerize express中使用handler和dataProvider?
我已经编写了第一个Swagger规范,并使用()生成了一个服务器存根。对于每个路径,我得到一个处理程序和一个数据提供程序我的问题是我打算如何使用这些工具? 对于一个具体的问题:我将如何更改以下代码,以便在数据库中查找用户并返回Node.js 我打算如何在swaggerize express中使用handler和dataProvider?,node.js,express,swagger,Node.js,Express,Swagger,我已经编写了第一个Swagger规范,并使用()生成了一个服务器存根。对于每个路径,我得到一个处理程序和一个数据提供程序我的问题是我打算如何使用这些工具? 对于一个具体的问题:我将如何更改以下代码,以便在数据库中查找用户并返回200(如果找到)或404(如果未找到) 为处理程序生成的代码: get: function getUser(req, res, next) { /** * Get the data for response 200 *
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);
});
}
为数据提供程序生成的代码:
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);
}
}
我知道我可以在处理程序中查找数据库。但这不是数据提供者的目的吗?我也很困惑。你找到解决办法了吗?我发现我可以使用提供的
回调
在肯定的情况下(即当找到数据库项时)发送响应
我仍然想知道在否定的情况下,哪些参数要传递给
回调
。我试图调用callback(404)
,表示我希望服务器给出“未找到资源”响应。但是,这会导致HTTP-500错误。我想分享一下我决定如何构建我的应用程序。然而,我很想知道你是否找到了一种更有效的方法。以下是我想到的基本概念:
- 处理程序-应管理所有路由相关逻辑,意味着参数和属性验证以及路由到正确的数据提供程序
- dataProvider-应管理与模型层/数据库的交互。如果处理程序最终不是正确的数据提供程序,则将控制权传递回处理程序
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);
});
}
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
});
}
},
data/user/{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);
});
}
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
});
}
},
我认为它看起来像是为了很好地分离责任而设计的。我不确定这个模式是否来自另一个框架/语言,但我在网上找不到太多支持这个模式的东西。你怎么看?不,很遗憾,我还没有找到解决方案。实际上,我最终还是手动完成了,而不是使用Swiggerize express,以更好地遵守现有系统。但我认为你的答案是我见过的最好的解决方案。