如何在sails.js中维护多个API版本
有没有人有使用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版本,但现在已经改变了将破坏现有function的需求。 例如,属性名称更改。 所以现在我们需要使用一个不同的控制器来满足这个新行为的要求。 我想要做的是两个API共存,所以向后兼容性不会中断。
// Request GET /api/v2/catVids?minimum_view_count=10000 // Response [{"title": "top cat fails"}, {"title": "funny-ass cats"}]
但是,我不确定实现这个最好的方法。 我认为可以工作的一种方法是在sails应用程序中使用以下目录设置:
api/ |-- controllers/ |---- v1/ |------ CatController.js |---- v2/ |------ CatController.js |-- models/ |---- v1/ |------ Cat.js |---- v2/ |------ Cat.js
我只是想知道是否有其他人遇到类似的情况,或者对这个话题有什么build议。
你可以把你的控制器放在子目录中,就像你的例子一样,因为Sails完全支持嵌套控制器。 但是,嵌套模型并不完全支持,因为它们会造成模糊性(请参阅此评论 )。 如果将两个命名为Cat.js的模型文件放在不同的子文件夹中,则当Sails抬起时,它们将发生碰撞,第二个模型文件将覆盖内存中的第一个。
这是一个学术问题,因为无论如何你需要用代码来区分你的两个模型版本。 也就是说,在你的v1控制器中,你需要确保你引用你的v1 Cat
模型,并且同样适用于v2。 最简单的解决scheme就是像在你的例子中那样使用一个scheme,但是为你的模型添加一个后缀(或者至less在v1之后):
api/ |-- controllers/ |---- v1/ |------ CatController.js |---- v2/ |------ CatController.js |-- models/ |---- v1/ |------ Cat.js |---- v2/ |------ Cat_v2.js
Sails将会忽略这些模型的子文件夹,为了确保你的蓝图以你想要的方式工作,你可以在你的控制器中添加一个_config
属性来强制他们使用正确的模型。
api / controllers / v1 / CatController.js :
module.exports = { _config: { model: 'cat' }, ... }
api / controllers / v2 / CatController.js :
module.exports = { _config: { model: 'cat_v2' }, ... }
更新(适用于Sails 1.0)
在控制器中_config
的使用在Sails 1.0中不再有效。 相反,您可以使用parseBlueprintOptions
configurationfunction来设置蓝图运行的模型,例如:
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; }