Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/452.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 如何在sails.js中维护多个API版本_Javascript_Node.js_Sails.js - Fatal编程技术网

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

Javascript 如何在sails.js中维护多个API版本,javascript,node.js,sails.js,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,但现在需求中的某些内容发生了变化,这将破坏现有的功能。例如,属性名称更改。所以现在我们需要使用一个不同

在使用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应用程序中使用以下目录设置:

api/
|-- controllers/
|---- v1/
|------ CatController.js
|---- v2/
|------ CatController.js
|-- models/
|---- v1/
|------ Cat.js
|---- v2/
|------ Cat.js

我只是想知道是否有其他人遇到过类似的情况,或者对这个主题有什么建议。

您可以像示例中那样将控制器放在子目录中,因为嵌套控制器完全受SAIL支持。但是,嵌套模型不完全受支持,因为它们会导致歧义(请参阅关于此问题的)。如果将两个名为Cat.js的模型文件分别放在不同的子文件夹中,它们将发生碰撞,当帆升起时,第二个模型文件将覆盖内存中的第一个模型文件

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

模型的子文件夹将被Sails忽略,因此为了确保您的蓝图按您想要的方式工作,您可以向控制器添加一个
\u config
属性,以强制它们使用正确的模型

api/controllers/v1/CatController.js

module.exports = {
  _config: {
    model: 'cat'
  },
  ...
}
module.exports = {
  _config: {
    model: 'cat_v2'
  },
  ...
}
api/controllers/v2/CatController.js

module.exports = {
  _config: {
    model: 'cat'
  },
  ...
}
module.exports = {
  _config: {
    model: 'cat_v2'
  },
  ...
}
更新(适用于Sails 1.0) 在控制器中使用
\u config
在Sails 1.0中不再有效。相反,您可以使用设置蓝图操作的模型,例如:

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;

}

所以你说只是你的控制器需要版本控制,而不是整个应用程序?是的,只是API需要版本控制以实现向后兼容性。你是在为你的所有操作运行blueprint路由,还是有自定义路由?另外,您现在是否正在运行任何类型的文件版本控制?像Git还是SVN?因为您可以在sailsjs()中为所有蓝图路线添加前缀,然后可以在您运行的版本控制系统中标记不同的版本。然后,您只需了解部署。您必须为每个版本运行一个sails服务器。我使用的是启动时由sails构建的路由。我使用git作为VCS,但我应该能够从同一个应用程序同时运行多个版本的API/api/v1路由只会转到与/api/v2路由不同的控制器。我不认为此时可以从子文件夹运行模型,我知道当前的蓝图也不会这样做。您的评论“应该能够从同一个应用程序运行多个版本的API…”有点武断。你为什么要这样做?您可以轻松地编写自己的蓝图,并简单地创建带有后缀的模型。UserV1,UserV2,UserV3。但是就像我说的,你必须创建你自己的蓝图。这个谷歌团队的线程可能会回答不同的问题:IMOSails应该允许API版本控制OOB。是否有任何进展,或者这仍然是一个有效的方法。是否仍有支持基于版本头的路由的方法?i、 e.Accept:version=2要添加中间件,请将policies.js编辑为:'v2/UserController':{'create':['isAuthenticated']},有人能告诉我是否需要为此维护两个不同的路由吗。例如,我有两个版本的控制器v1/userscocontroller.js,v2/userscocontroller.js现在在我的routes.js中。我是否必须保留两个不同的路由,如“get/v1/users”:“v1/userscocontroller.get”
“get/v2/users”:“v2/userscocontroller.get”