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

Jas*_*ims 8 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"}] 
Run Code Online (Sandbox Code Playgroud)

用户正在积极地使用API​​的v1,但现在已经改变了将破坏现有功能的要求.例如,属性名称更改.所以现在我们需要使用不同的控制器来满足对这种新行为的请求.我想要做的是让两个API共存,这样就不会破坏向后兼容性.

// Request
GET /api/v2/catVids?minimum_view_count=10000

// Response
[{"title": "top cat fails"}, {"title": "funny-ass cats"}] 
Run Code Online (Sandbox Code Playgroud)

但是,我不确定实现这个的最佳方法.我认为它可以工作的一种方法是在sails app中使用以下目录设置:

api/
|-- controllers/
|---- v1/
|------ CatController.js
|---- v2/
|------ CatController.js
|-- models/
|---- v1/
|------ Cat.js
|---- v2/
|------ Cat.js
Run Code Online (Sandbox Code Playgroud)

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

sgr*_*454 10

您可以像在示例中那样将控制器放在子目录中,因为Sails完全支持嵌套控制器.但是,嵌套模型并不完全支持,因为它们会导致模糊(请参阅此问题的评论).如果将两个名为Cat.js的模型文件放在单独的子文件夹中,它们将发生冲突,第二个将在Sails提升时覆盖内存中的第一个.

这是一个学术观点,因为你需要一些方法来区分你的两个模型版本代码.也就是说,在您的v1控制器中,您需要确保引用v1 Cat模型,同样适用于v2.最简单的解决方案是使用您的示例中的方案,但为模型添加后缀(或至少在v1之后的所有内容):

api/
|-- controllers/
|---- v1/
|------ CatController.js
|---- v2/
|------ CatController.js
|-- models/
|---- v1/
|------ Cat.js
|---- v2/
|------ Cat_v2.js
Run Code Online (Sandbox Code Playgroud)

Sails将忽略模型的子文件夹,因此为了确保您的蓝图按照您希望的方式工作,您可以_config向控制器添加属性以强制它们使用正确的模型.

api/controllers/v1/CatController.js:

module.exports = {
  _config: {
    model: 'cat'
  },
  ...
}
Run Code Online (Sandbox Code Playgroud)

api/controllers/v2/CatController.js:

module.exports = {
  _config: {
    model: 'cat_v2'
  },
  ...
}
Run Code Online (Sandbox Code Playgroud)

更新(对于Sails 1.0)

_config在Sails 1.0 中,控制器中的使用不再有效.相反,您可以使用parseBlueprintOptions配置功能来设置蓝图操作的模型,例如:

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;

}
Run Code Online (Sandbox Code Playgroud)