我正在使用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的新手,我很难搞清楚问题是什么或在哪里看。有没有人有任何线索或有人见过这个?
答案 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,实际上,您知道,不会发送内容。