node.js - 代理和重定向有什么区别

标签 node.js express

我想要服务所有发送到 / 的请求,就像它们发送到 /api/ 一样。例如,

/posts/ 应被视为 /api/posts/

据我所知这是代理,但我不确定代理和重定向之间的区别。主要的困惑来自于这样一个事实:redirect 将响应 header 的状态代码设置为 302,而代理将其设置为 200

代理之间有什么区别,对我来说做我想做的事情的最佳方式是什么?

最佳答案

您可能想要的名称是 rewriting :当特定端点收到请求时,它会被重写为 HTTP 服务器可以处理的内容。

借助 Express,您可以使用自定义中间件函数来实现这一点:

app.use(function(req, res, next) {
  // If the current request doesn't start with `/api`...
  if (req.url.indexOf('/api') !== 0) {
    // ...rewrite it by prefixing it with `/api`.
    req.url = '/api' + req.url;
  }
  next();
});

您必须将其包含在路线之前,因此它会在路线之前被调用。

这对客户端来说是完全透明的:他们认为他们正在获取 /posts 的响应,即使在内部,它是由 /api/posts 处理的处理程序。

如果您希望通过重定向使其明确,您可以使用以下内容:

app.use(function(req, res, next) {
  if (req.url.indexOf('/api') !== 0) {
    return res.redirect('/api' + req.url);
  }
  next();
});

这根本不透明。它告诉客户端:“嘿,您尝试请求 /posts,但您需要将请求定向到 /api/posts” 。这意味着客户必须提出额外的请求。

代理基本上是一种复杂的重写方式,但不是仅仅修改请求以使其最终到达正确的处理程序,而是向 /api/posts 发出实际的内部 HTTP 请求,其结果被发送回客户端。在您的情况下,它太过分了(代理通常用于将请求传递到其他 HTTP 服务器)。

关于node.js - 代理和重定向有什么区别,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37988883/

相关文章:

node.js - 无法将 typescript Express 应用程序部署到 Azure

javascript - 如何禁用用户 Firebase?

javascript - 如何使参数化 Express 路由在带或不带尾部反斜杠的情况下工作?

node.js - DynamoDB 应用程序架构

node.js - Express cookieSession 键未显示在数据 header 中

javascript - 为什么我的自定义验证功能不起作用?

node.js - 如何将池化与 Node 持久化一起使用?

node.js - 在sequelize中定义触发器 - NodeJS

node.js - sequelize 中的聚合函数

node.js - 如何在 Node.js 中使用 EventEmitter