是否可以在不创建服务器的情况下在NodeJS中获取POST数据?

时间:2018-07-29 21:28:20

标签: php node.js http http-post

我想用NodeJS文件替换当前处理从我的网页(仅LAN)接收和处理数据的PHP脚本。当前,JSON数据通过XMLHttpRequest在JS中发送:

var xhttp = new XMLHttpRequest();
var url = "/server.php";
xhttp.open("POST", url, true);
xhttp.setRequestHeader("Content-Type", "application/json");
xhttp.onreadystatechange = function () {
    ...
};

xhttp.send(content);

很显然,server.php是我要替换的文件。在此文件中,我收到如下数据:

$stringHttp = file_get_contents("php://input");

我已经在NodeJS中进行了广泛的研究,但是我发现的所有内容都使用以下基本布局:

http.createServer((request, response) => {
    ...
}).listen(8091);

现在,由于我的网页由Apache托管,因此可能无法在同一端口上创建此服务器。至少,这就是我从尝试运行NodeJS文件时收到的错误消息中得到的信息:

events.js:183
      throw er; // Unhandled 'error' event
      ^

Error: listen EADDRINUSE :::8091
    at Object._errnoException (util.js:992:11)
    at _exceptionWithHostPort (util.js:1014:20)
    at Server.setupListenHandle [as _listen2] (net.js:1355:14)
    at listenInCluster (net.js:1396:12)
    at Server.listen (net.js:1480:7)
    at Object.<anonymous> (/var/www/apache/testNode.js:15:4)
    at Module._compile (module.js:652:30)
    at Object.Module._extensions..js (module.js:663:10)
    at Module.load (module.js:565:32)
    at tryModuleLoad (module.js:505:12)

因此,基本上,我正在寻找file_get_contents("php://input")的NodeJS替代品。 因此,我的问题是:是否可以在不创建服务器的情况下在NodeJS中获取POST数据?

2 个答案:

答案 0 :(得分:2)

不,不是。

在您的PHP版本中,您有一台服务器。它是Apache,它利用了mod_php(例如)来执行PHP。

如果要使用Node.js执行程序,则需要某种方式来获取对该程序的HTTP请求。这涉及到运行服务器。

  

可能无法在同一端口上创建此服务器

不。您需要在其他端口上运行它。 (然后直接向其发布,或将Apache配置为在其前面充当代理)。

答案 1 :(得分:0)

好吧,如果您真的只想运行一个node.js脚本并完成以获取结果,那么您可以保留您的PHP脚本的外壳并使其运行node和您的脚本。您可以在命令行上向节点脚本传递所需的数据,也可以将其发送到stdio中,然后节点脚本将从任何一个中获取数据。

您的节点脚本将运行并创建所需的结果,并将其写入stdout。然后,PHP脚本将获取标准输出数据,并将其作为http响应转发。

没有人会形容这是做事的最佳方法。 HTTP响应发送到Apache,然后启动PHP交互程序以运行您的PHP脚本,从而启动node.js以运行您的node.js脚本。但是,如果仅是一次性使用这是一次性的事情,并且出于某些令人信服的原因,您在其他地方使用PHP并且为此需要node.js,那么您可以使它工作。

甚至可以为该脚本创建一个自定义路径,Apache可以将其配置为检测该路径,然后直接运行您的节点脚本(类似于PHP),而无需PHP中间人。我对Apache的了解不够,无法确切地建议如何做到这一点,但是有some references这样做。同样,它不是最佳方法,但可以使其起作用。


最佳性能的解决方案是在另一个端口上实际创建一个node.js服务器,并让Apache或其他代理检测要重定向到node.js服务器而不是重定向到node.js服务器的某些请求(通常基于路径)通过客户端发送到PHP或直接从客户端发布到其他端口(您必须在node.js服务器中启用CORS才能使其正常工作。)

相关问题