【问题标题】:Is it possible to obtain POST data in NodeJS without creating a server?是否可以在不创建服务器的情况下在 NodeJS 中获取 POST 数据?
【发布时间】:2019-01-06 03:47:09
【问题描述】:

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

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)

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

【问题讨论】:

  • 您可以在不同的端口上运行您的 node.js 服务器并将您的请求路径更改为类似 /node/server 的内容,然后配置您的 Apache 服务器以代理任何以 /node 开头的请求到您的节点服务器在其端口上。

标签: php node.js http http-post


【解决方案1】:

不,不是。

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

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

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

没有。您需要在不同的端口上运行它。 (然后要么直接发布到它,要么将 Apache 配置为在它前面充当代理)。

【讨论】:

  • You'd need to run it on a different port. (And then either post to it directly。这正是我所做的,而且效果很好。感谢您的提示!
【解决方案2】:

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

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

没有人会形容这是一种超级优化的做事方式。 HTTP 响应被发送到 Apache,然后启动 PHP 解释器以运行您的 PHP 脚本,该脚本启动 node.js 以运行您的 node.js 脚本。但是,如果它是一次性使用的,并且有一些令人信服的理由让您在其他地方使用 PHP 并且需要 node.js 来完成这一用途,那么您可以让它工作。

甚至可以为这个脚本创建一个自定义路径,Apache 可以配置为检测然后直接运行您的节点脚本(就像它对 PHP 所做的那样),而无需 PHP 中间人。我不太了解 Apache,无法确切地建议如何做到这一点,但有 some references 正在这样做。同样,不是最佳的,但它可以工作。


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

【讨论】:

    猜你喜欢
    • 2010-09-26
    • 2013-08-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-03-19
    • 2012-11-17
    • 1970-01-01
    • 2021-04-07
    相关资源
    最近更新 更多