有没有人在使用sails.js时有关于维护API的多个版本的想法?想象一个简单的例子:
// Request
GET /api/v1/catVids?min_view_count=10000
// Response
[{"video_title": "top cat fails"}, {"video_title": "funny-ass cats"}]
用户正在积极使用API的v1,但现在已经改变了会破坏现有功能的要求。例如,属性名称更改。所以现在我们需要使用不同的控制器来满足对这种新行为的请求。我想要做的是让两个API共存,这样就不会破坏向后兼容性。
// Request
GET /api/v2/catVids?minimum_view_count=10000
// Response
[{"title": "top cat fails"}, {"title": "funny-ass cats"}]
但是,我不确定实施此方法的最佳方法。我认为可行的一种方法是在sails app中使用以下目录设置:
api/
|-- controllers/
|---- v1/
|------ CatController.js
|---- v2/
|------ CatController.js
|-- models/
|---- v1/
|------ Cat.js
|---- v2/
|------ Cat.js
我只是想知道是否有其他人遇到类似的情况或对此主题有任何建议。
答案 0 :(得分:9)
您可以像在示例中那样将控制器放在子目录中,因为Sails完全支持嵌套控制器。但是,嵌套模型并不完全支持,因为它们会导致模糊(请参阅this comment)。如果将两个名为 Cat.js 的模型文件放在不同的子文件夹中,它们将发生冲突,第二个将在Sails提升时覆盖内存中的第一个。
这是一个学术观点,因为你需要一些方法来区分你的两个模型版本代码。也就是说,在您的v1控制器中,您需要确保引用v1 Cat
模型,同样适用于v2。最简单的解决方案是使用您的示例中的方案,但为模型添加后缀(或至少在v1之后的所有内容):
api/
|-- controllers/
|---- v1/
|------ CatController.js
|---- v2/
|------ CatController.js
|-- models/
|---- v1/
|------ Cat.js
|---- v2/
|------ Cat_v2.js
Sails将忽略模型的子文件夹,因此为了确保您的蓝图按照您希望的方式工作,您可以向控制器添加_config
属性以强制它们使用正确的模型。
<强> API /控制器/ V1 / CatController.js 强>:
module.exports = {
_config: {
model: 'cat'
},
...
}
<强> API /控制器/ V2 / CatController.js 强>:
module.exports = {
_config: {
model: 'cat_v2'
},
...
}
控制器中_config
的使用在Sails 1.0中不再有效。相反,您可以使用parseBlueprintOptions
config function来设置蓝图操作的模型,例如:
parseBlueprintOptions: function(req) {
// Get the default query options.
var queryOptions = req._sails.hooks.blueprints.parseBlueprintOptions(req);
// Add the _v2 suffix to the `using` property.
queryOptions.using = queryOptions.using + '_v2';
return queryOptions;
}