对localhost上的php内置服务器的Express.js管道请求导致ECONNREFUSED

时间:2017-09-30 12:16:16

标签: javascript php node.js express reverse-proxy

我正在构建一个使用npm进行开发的简单网站,它由一个支持php的提供程序托管。

使用php的唯一功能是发送电子邮件的联系表单。剩下的就是简单的html和javascript。

我使用一个简单的php服务器开始使用php -S localhost:8000来测试一个简单的php电子邮件脚本,然后再次在开发中我将email.php的代理请求转发到本地的php服务器。

节点应用程序在端口3000上,php服务器在端口8000上。问题是当请求通过 localhost:3000 / email.php 时,我通过以下快速服务器配置获得连接拒绝错误:

#!/usr/bin/env node

var express = require('express');
var app = express(),
  request= require('request'),
  port = +(process.env.PORT || 3000);


app.set('case sensitive routing', false);

app.post( '/email.php', function( req, res ){
  req.pipe( request({
    url: 'http://localhost:8000/email.php',
    qs: req.query,
    method: req.method
  }, function(error){
    if (error.code === 'ECONNREFUSED'){
      console.error('Refused connection');
    } else {
      throw error;
    }
  })).pipe( res );
});


 // other request handlers here

app.listen(port, function() {
  console.log('listening');
});

Php服务器肯定是up并且服务于端口8000上的所有页面,我可以使用浏览器进行浏览。我使用 curl 测试它,并且当使用curl直接发布到localhost:8000时似乎处理请求就好了。

我不确定为什么会出现这个错误,摸不着头脑,无法想到任何理由。

非常感谢帮助。

1 个答案:

答案 0 :(得分:2)

我弄清楚它是什么,噢!好吧,我会发布答案,万一其他人偶然发现了这个问题。

PHP似乎应该归咎于它;检查使用ss -ltn监听端口的套接字(我在Linux上,这可能不适合你)我意识到php服务器只监听IPv6。相关产出如下:

State      Recv-Q Send-Q                                              Local Address:Port                                                             Peer Address:Port                
LISTEN     0      128                                                           ::1:8000                                                                       

通过相关搜索,我在用户发布的用户注释下的Web服务器文档页面上找到了答案。查看帖子here。解决方案是使用127.0.0.1而不是localhost:

  

事实证明,如果你使用" php -S启动了php服务器   本地主机:80"服务器将仅以ipv6支持启动!

     

要通过ipv4访问它,您需要更改启动命令,如   所以:" php -S 127.0.0.1:80"它仅以ipv4模式启动服务器。