为什么Express函数同时将Request和Response作为参数?

时间:2018-05-22 21:35:46

标签: javascript node.js http express

我是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)。但是,如果我们返回一个响应,为什么响应也是回调函数中的参数?我一直认为它与响应对象的范围有关,但我不确定。

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

最佳, 阿比德

1 个答案:

答案 0 :(得分:2)

我认为你的问题的答案是,这是快递的作者决定实施图书馆的方式。在高层次上,express实际上只是一个轻量级的重量包装器,可以很容易地使用NodeJS构建基于中间件的http服务。这两个req& res对象被传递给每个快速中间件功能,实际上,Web服务很少能够在一个步骤中完成整个请求。通常,服务是作为中间件层构建的,可以通过多个步骤构建响应。

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

现在作者可能已经决定以不同的方式实现库,这样每个路由处理程序都应该返回一个对象,例如{{1}},而不是在响应对象上调用方法,但这将是一个约定的问题,你可以很容易地写一个包装快递包装,如果你愿意,可以让你写这样的服务。

希望这有帮助。