【问题标题】:Express Routes & Controllers快速路由和控制器
【发布时间】:2015-12-01 19:33:40
【问题描述】:

我知道 Express 不是一个开箱即用的 MVC 框架,但我正在尝试将其设置为一个。

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

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

它将运行 UserController 类中 showProfile 方法中的所有代码, 所以我的问题是,我将如何使用 Express 实现相同或类似的目标?

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

目前我有一个我想用作控制器的类和一个我想返回数据的方法,当用户导航到路由但还没有弄清楚如何时,我能够将数据记录到控制台将其作为响应发回。

【问题讨论】:

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


【解决方案1】:

如果您深入了解the documentation,您会发现您所指的“控制器方法”需要符合特定的签名。即,它们(至少)接收请求和响应表示。

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

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

你的 showProfile“方法”需要有这个签名:

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

我将“方法”放在引号中,因为 express 不会将其作为方法调用,除非您将其显式绑定到控制器对象。我们在这里将它作为一个未绑定的函数传递。如果您想将其用作方法(以this 访问控制器),请将userController.showProfile.bind(userController) 传递给router.get

但是现在让我们坚持showProfile 处理程序的reqres 参数(这是正确的名称)。 req 代表 HTTP 请求,您可以从中获取标头、请求负载和其他内容。 res 是要发送的 HTTP 响应。所以你可以用它来设置一个HTTP状态码,发送body数据等等。

出于说明目的,我们假设您可以通过调用userController.getProfile(id) 同步获取您的用户个人资料。让我们假设,通过某种机制,userId 属性设置在 request 上,这是当前经过身份验证的用户 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 简单地访问其属性。当然,你甚至不需要将处理程序定义为控制器对象的方法,它可以是一个独立的函数。

【讨论】:

    【解决方案2】:

    您可以成功路由到showProfile 对吗?

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

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

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

    【讨论】:

      猜你喜欢
      • 2017-01-23
      • 2017-02-26
      • 1970-01-01
      • 2017-06-14
      • 1970-01-01
      • 2018-09-27
      • 2018-03-04
      • 2015-09-07
      • 2021-10-24
      相关资源
      最近更新 更多