当API返回204且没有内容时使用“gulp serve”时出现代理错误

时间:2014-08-01 23:45:09

标签: node.js gulp

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

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

吞/ 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网址时,我收到上述错误,该网址发回的响应为204,没有内容。

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

回复: 204无内容

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

我想也许只是因为没有内容而窒息。因此,我们创建了第二个端点,它也返回了204 No Content,它似乎工作正常。但是,公平地说,这个问题似乎是间歇性的 - 它有时是有效的,有时则不然。这很令人困惑。

据我们所知,它只发生在此删除网址上。我是Node的新手,我很难搞清楚问题是什么或在哪里看。有没有人有任何线索或有人见过这个?

1 个答案:

答案 0 :(得分:3)

事实证明,API的开发人员正在向他发送内容以及他的204,当他不应该这样做时 - 留下一些调试代码。节点代理使用的HTTP解析器然后从中读取内容后续请求开始时的缓冲区然后抛出错误,因为它没有看到正确形成的HTTP请求 - 因为缓冲区中的第一件事是PHP var_dump。

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

节点的http-proxy模块明确地不进行错误处理,而是留给最终用户的onus。如果您没有处理错误,它会冒泡到未捕获的异常中,并会导致应用程序关闭,正如我所看到的那样。

所以,修复只是:

<强>吞/ 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,实际上,您知道,不会发送内容。