【问题标题】:Accessing the data from a Node JS GET request without chaining callback functions在不链接回调函数的情况下从 Node JS GET 请求访问数据
【发布时间】:2018-08-25 23:13:17
【问题描述】:

我使用 node.js 只是为了运行计划任务并使用 GET 请求。我将粘贴一些代码来显示我想要做的事情,尽管由于一个明显的原因它不起作用:

const http = require("http");
const request = require("request");

http.createServer(function (req, res) {
    res.writeHead(200, {"Content-Type": "text/html"});
    res.write("Hello, World!");
    let a = getRequest();
    console.log(a);
    res.end();
}).listen(8080);

function getRequest() {
    let b;
    request("http://www.google.com", function(err, res, body) {
        b = body;
    })
    return b;
}

因此,由于请求是异步的,因此正文中的 b 不起作用,这使得 b 在最终打印时未定义。我知道应该使用这些回调函数的方式是保持回调函数的链接,因为这是唯一可以访问body 内容的地方。但是,我不想继续链接函数,因为它完全破坏了程序的结构。我想将所有节点服务器命令保留在 http.createServer 块内。我不想将它们放在从回调函数内部调用的函数中。在这个例子中,异步进程没有任何意义,因为无论如何只有 1 个 get 请求,并且在收到它之前无法在 console.log 中显示。

我只需要一种简单的方法来使用 get 请求抓取数据。完美的是,如果我有一些功能可以提供一堆链接,它从它们获取原始 html,然后它等待它们全部完成,以便我可以处理所有数据一次。

如何在 Node.js 中实现这样的功能?

【问题讨论】:

  • 不完全确定您想要什么。展示你如何通过链接解决这个问题,然后也许有人可以告诉你如何改进它。
  • 例如,console.log(b) 在回调函数内部有效,但 console.log(a) 只是返回 undefined,因为它在函数外部。解决这个问题的方法是在回调函数中移动 console.logres.end

标签: javascript node.js get


【解决方案1】:

您可以使用此模块:sync-request。 使用此模块,您将能够从您的 NodeJS 代码发出同步 Web 请求。

【讨论】:

  • 必须喜欢该网站上的免责声明:您不应该在生产应用程序中使用它。在 node.js 应用程序中,您会发现您完全无法扩展您的服务器。在客户端应用程序中,您会发现同步请求会导致应用程序挂起/冻结。同步 Web 请求是导致浏览器崩溃的第一大原因。对于生产应用程序,您应该使用 then-request,除了它是异步的之外,它完全一样。
  • 我知道,但如果我理解得很好,您的请求会在您的 HTTP 服务器之前运行。这意味着您可以使用此模块,因为您没有在一个端点中实现同步请求,因此您不会阻止服务器的执行。
猜你喜欢
  • 1970-01-01
  • 2022-01-15
  • 2018-02-01
  • 2010-11-25
  • 1970-01-01
  • 2011-08-15
  • 1970-01-01
  • 1970-01-01
  • 2018-07-03
相关资源
最近更新 更多