如何在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中不再有效。 相反,您可以使用parseBlueprintOptionsconfigurationfunction来设置蓝图运行的模型,例如:

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