如果您深入了解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 处理程序的req 和res 参数(这是正确的名称)。 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 简单地访问其属性。当然,你甚至不需要将处理程序定义为控制器对象的方法,它可以是一个独立的函数。