Node.js 使用“时获取代理错误”;“大口大口大口地端上来”;当API返回204而没有内容时

Node.js 使用“时获取代理错误”;“大口大口大口地端上来”;当API返回204而没有内容时,node.js,gulp,Node.js,Gulp,我正在使用Gulp开发一个由Yeoman的Gulp角度生成器生成的角度应用程序。我已将其配置为将对/api的请求代理到另一个端口,即我的api正在侦听的端口。该端口实际上通过SSH隧道转发到外部服务器 以下是我为自己的API编辑的Yeoman生成的配置: gulp/server.js 'use strict'; var gulp = require('gulp'); var browserSync = require('browser-sync'); var httpProxy = requ

我正在使用Gulp开发一个由Yeoman的Gulp角度生成器生成的角度应用程序。我已将其配置为将对
/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
var proxy = httpProxy.createProxyServer({
  target: proxyTarget
}).on('error', function(e) {
  console.log(JSON.stringify(e, null, ' '))
});
stdout

[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不支持实际的删除http方法,因此我们将其发布到此端点)

响应:204无内容

API也在开发中,并通过内置的PHP web服务器提供服务。服务器告诉我们的是,客户端(本例中称为节点,因为它是代理)在PHP发送响应之前挂断

我想也许这只是因为没有内容而窒息。因此,我们创建了第二个端点,该端点也没有返回任何内容,并且似乎工作正常。但是,公平地说,这个问题似乎是间歇性的——它有时有效,有时无效。这很令人困惑


然而,就我们所知,它只发生在这个删除URL上。我对Node非常陌生,很难弄清楚问题是什么,或者在哪里查找。有人有任何线索吗?或者以前有人看到过吗?

事实证明,API的开发人员在不应该向我发送内容的时候向我发送了内容-一些调试代码留在了我的文档中。节点代理使用的HTTP解析器随后在后续请求开始时从缓冲区读取该内容,然后抛出一个错误,因为它没有看到格式正确的HTTP请求,因为缓冲区中的第一件事是PHP var_转储

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

节点的http代理模块不显式执行错误处理,将ONU留给最终用户。如果不处理错误,它将冒泡成一个未捕获的异常,并将导致应用程序关闭,正如我所看到的

因此,解决方法很简单:

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
var proxy = httpProxy.createProxyServer({
  target: proxyTarget
}).on('error', function(e) {
  console.log(JSON.stringify(e, null, ' '))
});
控制台现在将记录所有代理错误,但进程不会停止,后续请求将继续按预期提供服务

对于所讨论的错误,控制台输出为:

{
 "bytesParsed": 191,
 "code": "HPE_INVALID_CONSTANT"
}
此外,我们已经修复了API以尊重其204,实际上,您知道,不发送内容