快速路线&控制器

时间:2015-12-01 19:33:40

标签: javascript node.js model-view-controller express ecmascript-6

我明白开箱即用Express不是MVC框架,但是我试图将其设置为一个。

我在PHP中使用过其他类似的框架,比如Laravel,你在路线中可以使用像

这样的控制器
Route::get('user/profile', 'UserController@showProfile');

这将运行UserController类中showProfile方法中的所有代码, 所以我的问题是,如何使用Express实现同样的东西或类似的东西?

我正在使用Node 5并在ECMAScript 6中编写代码。

目前我有一个我想用作控制器的类和一个我想要返回数据的方法,我可以在用户导航到路线时将数据记录到控制台但是还没弄明白如何将其作为回复发回。

2 个答案:

答案 0 :(得分:0)

您能够成功路由到showProfile吗?

Route::get('user/profile', 'UserController@showProfile');

但现在在showProfile内您需要访问Express层吗?

你总是可以将路由器包装在一个对象中,以便你的控制器可以引用它(例如UserController.router它可以是控制器上的属性,或module.exports它并在UserController本地设置它{1}})。我认为一些MVC框架确实有一个独立的“路由器”类,基本上就是我在这里描述的。

答案 1 :(得分:0)

如果你潜入the documentation,你会发现"控制器方法"你指的是需要符合特定的签名。即,他们(至少)收到请求和回复表示。

如果您已经创建了router,这将大致相当于您发布的PHP:

router.get('user/profile', userController.showProfile)

您的showProfile"方法"需要有这个签名:

const userController = {
  showProfile(req, res) { /*...*/}
}

我把"方法"在引号中因为express不会将其称为方法,除非您将其显式绑定到控制器对象。我们在此处将其作为未绑定的函数传递。如果您想将其用作方法(以this的形式访问控制器),请将userController.showProfile.bind(userController)传递给router.get

但是现在让我们坚持使用req处理程序的resshowProfile参数(这是正确的名称)。 req表示HTTP请求,您可以从中获取标头,请求有效负载和其他内容。 res是将要发送的HTTP响应。因此,您可以使用它来设置HTTP状态代码,发送正文数据等。

为了便于说明,我们假设您可以通过调用userController.getProfile(id)来同步获取用户个人资料。我们假设,通过某种机制,在userId uest上设置属性req,该属性是当前经过身份验证的用户ID。

const userController = {
  showProfile(req, res) {
    // We call some code to get what we want to send back
    const profile = userController.getProfile(req.userId)
    // We send it in the response as JSON
    res.send(profile)
  }
}

res.json将JSON.stringify配置文件并将其作为响应有效负载发送。

你怎么设置req.userId?嗯,这只是一个例子,但你可以通过使用中间件来实现类似的结果。中间件只是执行某些操作的处理程序,然后让其他处理程序继续处理请求。但同样,从文档中可以阅读很多内容。

†​​但通常不需要,因为控制器往往是单身人士。您只需通过userController.otherProperty访问其属性即可。当然,您甚至不需要将处理程序定义为控制器对象的方法,它可以是一个独立的函数。