2017-11-18 2 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 원칙을 적용하는 것입니다!

끝점 URL에 대한 API 관점에서 궁금합니다. 현재

그들은 :

호스트 이름/API/사용자/: ID - 사용자 계정

호스트 이름/API/사용자/: ID/위치 - 사용자 위치

호스트 이름/api/user/: id/locations/: locationid - 특정 사용자의 특정 위치 정보

호스트 이름/API/사용자/: ID/위치/: locationid/작물 - 목록 특정 사용자

에 속하는 특정 위치에 심어 져 모든 작물이 URL 구조는 나머지 관점에서 OK인가?

호스트 이름/API/사용자/: ID/위치

요청 후는 라우터와 컨트롤러 내 경로, 전 대한 책임을 져야 내가 arround를 내 머리 포장 은어 API ...에서 수신/: 위치 식별자

사용자 라우터와 컨트롤러에서이 URL을 처리해야합니까? 또는 위치 라우터 및 컨트롤러에서?

URL에 분명히 : "사용자와 함께 : id, 내 위치를 찾으십시오 : 그에게 속한 locationid.".

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

그리고 :

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

는하지만이 방법은, 내가 것 엔까지 모든 가능한 URL을 포함하는 사용자의 라우터 생각 : 그래서, 나 같은 미경 개발자는 자동으로이 경로는 사용자의 라우터 내부해야한다고 가정 다른 라우터 및 컨트롤러에는 없습니다. 그리고이 사실은 내가 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)은 적용 할 필터와 반환 할 데이터의 하위 집합을 이해하는 데 기본이됩니다.