【问题标题】:Why does an Express function take both the Request and Response as arguments?为什么 Express 函数将请求和响应都作为参数?
【发布时间】:2018-11-01 18:14:38
【问题描述】:

我是 node.js 的新手,并且熟悉 Express。以下代码是我的困惑之源:

var server = http.createServer(handleRequest);

function handleRequest(req, res) {
  var path = req.url;

  switch (path) {
  case "/n":
    return renderPage_1(req, res);
  default:
    return renderPage_2(req, res);
  }
}

我了解服务器需要接受一个 HTTP 请求(req)。但是,如果我们要返回一个响应,为什么响应也是回调函数中的一个参数呢?我一直陷入死胡同,认为它与响应对象的范围有关,尽管我不确定。

非常感谢您对此事进行澄清。我一直无法找到描述我的困惑的资源。

最好, 遵守

【问题讨论】:

  • 因为你没有返回响应......在这种情况下,返回除了终止函数之外什么都不做。
  • 查看文档。
  • @KevinB 在这种情况下,switch语句返回renderPage_1(req,res)的结果。我不明白它除了终止函数之外什么都不做,因为否则它默认为 renderPage_2(req,res)。总体而言,我的代码有效,我了解如何编写它以使其有效,但我不知道引擎盖下发生了什么,如果在原始问题中不够清楚,抱歉。
  • 响应参数包含一个可用于构建/发送响应的对象。这就是它的目的。没有它,您将无法响应客户端。
  • 基本请求处理通常意味着您调用res.send(reply)res.render(view, params)。这就是 express 的构建方式。

标签: javascript node.js http express


【解决方案1】:

我认为你的问题的答案是 express 的作者决定如何实现这个库。在高层次上,express 实际上只是一个轻量级的包装器,它可以很容易地使用 NodeJS 构建基于中间件的 http 服务。将 req 和 res 对象都传递给每个 express 中间件函数的原因是,在实践中,Web 服务很少能够在一个步骤中完成整个请求。服务通常被构建为中间件层,通过多个步骤构建响应。

例如,您可能有一个中间件函数,该函数在请求中查找身份信息并获取任何相关的身份元数据,同时在响应中设置一些特定于身份验证的标头。然后,请求可能会流向授权中间件,该中间件使用获取的元数据来确定当前用户是否被授权,如果用户未被授权,则可以通过关闭响应流来提前结束请求。如果用户被授权,那么请求将继续到下一个中​​间件等。为了使这项工作,每个中间件功能(堆栈的步骤)需要能够访问来自请求的信息以及将信息写入响应. Express 通过将请求和响应对象作为参数传递给中间件函数来处理此问题,但这只是一种方法。

现在作者本可以决定以不同的方式实现该库,这样每个路由处理程序都应该返回一个对象,例如 { status: 200, content: "Hello, world" },而不是调用响应对象上的方法,但这将是一个约定问题,你可以轻松编写 express 的包装器,让您可以根据需要编写这样的服务。

希望这会有所帮助。

【讨论】:

  • 这真的很有帮助!正是我一直在寻找的关于 Express 的见解!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-08-12
  • 1970-01-01
  • 2018-12-30
  • 2020-11-04
相关资源
最近更新 更多