2017-11-18 3 views
0

私はリレーショナルmysql DBを使用しているプロジェクトに取り組んでいます。私のテーブルは以下のとおりです。REST APIのURLとそのルータとコントローラ間の配布

  • ユーザー
  • 場所ノード/ Expressを使用
  • 作物

簡素化されたコードの構造:

/routers 
/routers/User.js 
/routers/Location.js 
/routers/Crop.js 
/controlers 
/controlers/UserController.js 
/controlers/LocationController.js 
/controlers/CropController.js 
/models 
/models/UserModel.js 
/models/LocationModel.js 
/models/CropModel.js 
app.js 

関係は、ユーザーができることです多くの場所を持つms)、場所には植えられた作物がたくさんあるかもしれません。

DB関係のものは、問題ありません。私の質問は、論理的に自分のコードを構造化する方法と、同時にRESTの原則を維持することです!

私はAPIの観点から、エンドポイントURLについて疑問に思っています。

現在、彼らは以下のとおりです。

ホスト名/ API /ユーザー/:ID - ユーザーアカウント

ホスト名/ API /ユーザー/:ID /場所 - ユーザーの場所

ホスト名/ api/user /:id/locations /:locationid - 特定のユーザーに所属する特定の場所に関する情報

ホスト名/ API /ユーザー/:ID /場所/:locationid /作物 - リスト特定のユーザー

に属している特定の場所に植えられているすべての作物は、このURLの構造は、残りの視点からOKですか?

、要求がAPIに受信された後、私は私の頭をラップカントはarroundの...私のルートを担当するべきルータとコントローラ、例:

ホスト名/ API /ユーザー/:ID /場所/:locationid

ユーザのルータとコントローラからこのURLを処理する必要がありますか? またはルータとコントローラの場所から?

URLには明らかに次のようなメッセージが表示されます。 "ユーザー:id、私の所在地:彼の所属するlocationidを見つけてください。"だから、未経験開発者としての私は、自動的にこのルートがユーザルータ内であることを前提としています

UserRouter.get(/:id/locations/:locationid, function(....){ 
    UserController.getUserLocationById(:id, :locationid); 
}) 
app.use('/user', UserRouter) 

しかし、この方法で、私は、ENまでのすべての可能なURLを含むユーザー・ルータとなると思う:

/user 
/user/:id 
/user/:id/locations 
... 
... 
/user/:id/crops 
/user/:id/crops/:cropid 
... 

そして、他のルータやコントローラには何もありません。そして、私はこの事実だけが、私がREST APIのコード構造について間違って考えていると思うようにしています。

現在、/ user ....で始まるすべてのルートは、User Expressルータで処理され、上記の例のurlのUserController.getUserLocationByIdに渡されます。

しかし、私はこのようにミスをすると思います。

誰かが私の頭が痛むことを理解していたら、それを解決するのを手伝ってもらえますか?

よろしくお願いします。

答えて

1

ルーティングはわかりやすく、RESTに準拠しています。 擬似URLを読むと、それを使ってどのような結果が得られるかがわかります。

実際の実装についての私の意見は、各ルータが最初のトークン(ユーザー、場所、作物...)に基づいてルートを処理する責任があり、責任あるコントローラへの内部マッピングはあなたが返そうとしているデータ。

私にはあなたはこれに従うことができます。

URL: hostname/api/user/:id 
ROUTE: user 
DATA: user 

URL: hostname/api/user/:id/locations 
ROUTE: user 
DATA: location 

URL: hostname/api/user/:id/locations/:locationid 
ROUTE: user 
DATA: location 

URL: hostname/api/user/:id/locations/:locationid/crops 
ROUTE: user 
DATA: crop 

URL: hostname/api/locations/:locationid 
ROUTE: location 
DATA: location 

URL: hostname/api/locations/:locationid/crops 
ROUTE: location 
DATA: crop 

URL: hostname/api/crops/:cropid/locations 
ROUTE: crop 
DATA: location 

ルートは、着信要求をハンドラに責任ルータになります。 データは、データを提供し、検証を行うなどの責任を負うコントローラになります。

各コントローラは、どのURLにアクセスしても所有者であるデータの配信のみを担当します。 もちろん、ルーティング(URL)はどのフィルタを適用するのか、したがってどのデータのサブセットを返すのかを理解するために基本的なものになります。

関連する問題