【问题标题】:Getting proxy error when using "gulp serve" when API returns 204 with no content当 API 返回 204 且没有内容时使用“gulp serve”时出现代理错误
【发布时间】:2014-10-13 22:38:44
【问题描述】:

我正在使用 Gulp 开发由 Yeoman 的 gulp-angular 生成器生成的 Angular 应用程序。我已将其配置为将 /api 的请求代理到另一个端口,即我的 API 正在侦听的端口。该端口实际上是通过 SSH 隧道转发到外部服务器的。

这是我为自己的 API 编辑的 Yeoman 生成的配置:

gulp/server.js

'use strict';

var gulp = require('gulp');

var browserSync = require('browser-sync');
var httpProxy = require('http-proxy');

/* This configuration allow you to configure browser sync to proxy your backend */
var proxyTarget = 'http://localhost:3434/api'; // The location of your backend
var proxyApiPrefix = 'api'; // The element in the URL which differentiate between API request and static file request

var proxy = httpProxy.createProxyServer({
  target: proxyTarget
});

function proxyMiddleware(req, res, next) {
  if (req.url.indexOf(proxyApiPrefix) !== -1) {
    proxy.web(req, res);
  } else {
    next();
  }

// ...rest of config truncated

标准输出

[BS] Watching files...

/Users/jason/dev/web/node_modules/http-proxy/lib/http-proxy/index.js:114
    throw err;
          ^
Error: Parse Error
    at Socket.socketOnData (http.js:1583:20)
    at TCP.onread (net.js:527:27)

当我的应用程序尝试访问特定的 API url 并返回 204 的响应时,我收到了上述错误。

url 结构: POST /api/resource/delete (API 不支持实际的 DELETE http 方法,所以我们 POST 到这个端点)

响应: 204 无内容

API 也在开发中,并通过内置的 PHP Web 服务器提供服务。服务器告诉我们的是客户端(在这种情况下也称为 Node,因为它是代理)在 PHP 发送响应之前就挂断了。

我想也许只是因为没有内容而窒息。因此,我们创建了第二个端点,它也返回 204 No Content,它似乎工作正常。但是,公平地说,这个问题似乎是断断续续的——有时有效,有时无效。这很混乱。

据我们所知,它只发生在这个删除 URL 上。我对 Node 很陌生,很难弄清楚问题是什么或去哪里找。有没有人有任何线索或以前有人见过这个?

【问题讨论】:

    标签: node.js gulp


    【解决方案1】:

    事实证明,API 的开发人员向我发送了他不应该发送的 204 内容 - 一些调试代码留在了里面。node-proxy 使用的 HTTP 解析器随后从缓冲区中读取该内容在后续请求开始时抛出错误,因为它没有看到格式正确的 HTTP 请求 - 因为缓冲区中的第一件事是 PHP var_dump。

    碰巧的是,我的前端应用程序执行了删除调用,然后通过 GET 请求刷新了另一个对象。它们发生得如此之快,以至于 DELETE 调用似乎杀死了 gulp 服务器,而实际上它是之后的 GET 命令。

    node 的 http-proxy 模块明确不进行错误处理,将责任留给最终用户。如果您不处理错误,它会冒出一个未捕获的异常并导致应用程序关闭,正如我所看到的。

    所以,解决方法很简单:

    gulp/server.js

    var proxy = httpProxy.createProxyServer({
      target: proxyTarget
    }).on('error', function(e) {
      console.log(JSON.stringify(e, null, ' '))
    });
    

    控制台现在将记录所有代理错误,但进程不会终止,后续请求将继续按预期处理。

    对于有问题的错误,控制台输出为:

    {
     "bytesParsed": 191,
     "code": "HPE_INVALID_CONSTANT"
    }
    

    此外,我们已修复 API 以支持其 204,实际上,您知道,不发送内容。

    【讨论】:

      猜你喜欢
      • 2018-11-16
      • 2020-02-08
      • 1970-01-01
      • 2019-11-19
      • 1970-01-01
      • 1970-01-01
      • 2016-06-14
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多