如何在sails.js中维护多个API版本

时间:2014-10-02 19:12:06

标签: javascript node.js sails.js

有没有人在使用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

我只是想知道是否有其他人遇到类似的情况或对此主题有任何建议。

1 个答案:

答案 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'
  },
  ...
}

更新(对于Sails 1.0)

控制器中_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;

}