我正在使用关系mysql DB开发一个项目。我的表是:
使用Node / 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
关系是用户可以拥有多个地点(农场),并且在某个地点可能会种植许多作物。
数据库关系的东西已经完成,没问题。我的问题是关于如何逻辑地构造我的代码,同时保持REST原则!
我想从API的角度来看关于端点网址。
目前他们是:
主机名/ api / user /:id - 用户帐户
主机名/ api / user /:id / locations - 用户位置
主机名/ api / user /:id / locations /:locationid - 有关属于特定用户的特定位置的信息
hostname / api / user /:id / locations /:locationid / crops - 列出在特定位置种植的所有作物,属于特定用户
这个网址结构从休息角度看是否正常?
在API收到请求之后,我无法将我的头部包裹起来......路由器和控制器应该负责我的路由,例如:
hostname / api / user /:id / locations /:locationid
是否应该从用户路由器和控制器处理此URL? 或者从路由器和控制器的位置?
网址清楚地说:"对于用户:id,找到我的位置:locationid属于他。"。因此,我作为没有经验的开发人员会自动假设此路由应位于用户路由器中:
UserRouter.get(/:id/locations/:locationid, function(....){
UserController.getUserLocationById(:id, :locationid);
})
app.use('/user', UserRouter)
但是这样,我想我会使用包含所有可能网址的用户路由器:
/user
/user/:id
/user/:id/locations
...
...
/user/:id/crops
/user/:id/crops/:cropid
...
其他路由器和控制器都没有。而我这个事实只是让我觉得我在思考REST API代码结构是错误的。
目前以/ user ....开头的每个路由都由我的User Express路由器处理,然后传递给上面示例url中的UserController.getUserLocationById。
但我认为我这样犯了错误。
如果有人理解我的头脑,你能帮我解决一下吗?
最好的问候
答案 0 :(得分:1)
您的路由对我来说很清楚,并且符合REST。 阅读伪网址,对我来说,可以理解你将使用它们的结果。
我对实际实现的看法是每个路由器应该负责根据第一个令牌(用户,位置,裁剪......)来处理路由,并且应该基于您将要返回的数据。
对我来说,你可以这样做:
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
路由,将负责处理传入请求的路由器。 数据,将由Controller负责提供数据,进行验证等。
这样做无论您使用哪个网址到达那里,每个控制器都只负责提供其所有者的数据。 当然,路由(URL)将是理解要应用哪个过滤器以及返回哪个数据子集的基础。