Node JS - 等待完整响应

3

我有一个API(使用Nginx编写的PHP语言)。

我使用Node JS向该API发送请求。

有时需要5-7秒钟才能完成API所需的操作。

问题在于Node JS不会等待完整的响应到达。

http.get(url, function(response){
    // called right away instead of waiting until it finishes
});

我已经尝试使用 .end() 和 .close() 事件,但没有成功。

我该如何让 NodeJS 等待?或者...我该如何让 PHP 通知 node “嘿,现在我完成了”。

重要的一点是:当我尝试 CURL 到 API 时,它会等待完整的响应。


而且,返回的“response”对象中有什么?你看了吗?你读过node.js文档中的“http.get()”是如何工作的吗? - jfriend00
2个回答

1
使用原生的http客户端时,您需要在解析数据之前手动追加块。因此,大多数人不使用原生的http客户端。您应该使用类似于请求模块的东西。
npm install request

跟着(Followed by)
var request = require('request');
request(url, function (error, response, body) {
  if (!error && response.statusCode == 200) {
    console.log(body)
  }
})

谢谢Yuri。我尝试使用请求模块,但没有任何改变。回调函数立即触发,即使API仍在工作中。有什么线索吗? - Matan Reuven
如果您的 PHP 应用程序结束了 HTTP 连接,然后继续做更多的工作,那么在这种情况下,您无能为力。PHP 应用程序必须要么等到完成所有工作后再关闭连接,要么公开一个“状态”API,该 API 以某种方式响应任务的状态,以便 Node 应用程序可以轮询它,一旦确认任务完成,就会触发回调函数。 - Yuri Zarubin
Yuri,那是我的问题。你的建议我该怎么做呢?我要如何让PHP在所有事情都完成后才关闭连接? - Matan Reuven
我从未编写过php程序,但是查看了这个文档http://php.net/manual/en/features.connection-handling.php,似乎`flush();``ob_flush();``session_write_close();`处理关闭连接。所以我认为在所有操作完成之前不要调用它们? - Yuri Zarubin

1

NodeJS以完全异步的方式工作。这意味着所有代码都会按顺序自上而下执行,而无需等待任何带有回调函数的函数。

如果你从PHP过来,你可能期望它做到:

ExecuteThis();
ThenThis();
AndFinallyThis();

但是NodeJS不会这样做。它只是立即开始执行所有内容,然后返回结果。就像运行此命令一样:

php ExecuteThis.php && php ThenThis.php && php AndFinallyThis.php

你需要的是一个异步瀑布流,一个回调函数,一个Promise或类似的结构,再加上一个HTTP请求

谢谢Adam,但我不是JS的新手。这不是问题所在。 - Matan Reuven
啊,没问题。看到你遇到了“不等待完整响应”的问题 - 这通常是由于JS的异步问题引起的。我会把这个答案留在这里,以防其他人也遇到这个问题,但是对Node这一领域还不熟悉。 - Adam Link

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接