誰かが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"}]
ただし、これを実装するための最良の方法がわかりません。それが機能すると思う1つの方法は、sailsアプリ内で次のディレクトリ設定を使用することです。
api/
|-- controllers/
|---- v1/
|------ CatController.js
|---- v2/
|------ CatController.js
|-- models/
|---- v1/
|------ Cat.js
|---- v2/
|------ Cat.js
他の誰かが同様のシナリオに遭遇したか、またはトピックに関する提案があるかどうか疑問に思っています。
ネストされたコントローラーはSailsによって完全にサポートされているため、例のようにコントローラーをサブディレクトリに配置する必要はありません。ただし、ネストされたモデルは、あいまいさが生じるため、完全にはサポートされていません(この問題に関するこのコメントを参照してください)。Cat.jsという名前の2つのモデルファイルを別々のサブフォルダーに配置すると、それらは衝突し、Sailsが持ち上げられたときに、2番目のモデルファイルがメモリ内の最初のファイルを上書きします。
とにかくコードで2つのモデルバージョンを区別する方法が必要になるため、これは一種の学術的なポイントです。つまり、v1コントローラーでは、v1Cat
モデルを参照していることを確認する必要があります。v2についても同様です。最も簡単な解決策は、例のようなスキームを使用することですが、モデル(または少なくとも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'
},
...
}
_config
コントローラでのの使用は、Sails1.0では無効になりました。代わりに、parseBlueprintOptions
config関数を使用して、ブループリントが動作するモデルを設定できます。例:
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;
}
この記事はインターネットから収集されたものであり、転載の際にはソースを示してください。
侵害の場合は、連絡してください[email protected]
コメントを追加