【问题标题】:How to make an HTTP/HTTPS request within a Node.js server?如何在 Node.js 服务器中发出 HTTP/HTTPS 请求?
【发布时间】:2021-10-10 05:16:40
【问题描述】:

我刚刚开始学习 Node.js,现在,我正在尝试通过 cPanel 使用 Node.js 应用程序,以便在访问其应用程序的 URL 时提供 JSON 响应。

访问应用程序的 URL 时,很明显 Node.js 服务器正在正常工作。因此,在编辑主 JS 文件并重新启动 Node.js 应用程序后,再次访问 URL 时会反映更改。

我的问题: 在https.createServer( function (req, res) {}); 的函数中,我想向其他地方的 PHP 文件发出 HTTPS 请求,该文件返回 JSON 响应。目前,我什至无法从任何类型的 PHP 文件请求中得到响应或错误。

var https = require('https');
var server = https.createServer(function (req, res) {
    var message = "";
    res.writeHead(200, {
        'Content-Type': 'text/plain'
    });

    var options = {
        host: "mydomain.com",
        path: '/myPhpScript.php'
    };
    https.get(options, function(res) {
        var bodyChunks = [];
        res.on('data', function(chunk) {
            bodyChunks.push(chunk);
        }).on('end', function() {
            var body = Buffer.concat(bodyChunks);
            message += body;
        })
    }).on('error', function(e) {
        message += e;
    });
    res.end(message);
});
server.listen();

如您所见,message 将显示在浏览器窗口中,但它是空的。访问 App URL 时没有显示任何内容。是否可以使用 Node.js HTTPS 服务器发出 HTTPS 请求?

注意: 我也试过 native-requestaxios 并遇到了同样的问题。

【问题讨论】:

  • 当您从浏览器访问 php url 时会发生什么?它是否返回您想要的内容?这是节点中的 http(s) 请求的问题吗?您是否尝试过其他网址,例如https://example.com?在您的服务器代码中,您无需等待请求完成,而是立即发送一条空消息。在“结束”事件回调中移动res.end()
  • @Marc 感谢您的评论。 PHP URL 返回它应该返回的内容。 res.end(message) 是我代码中的倒数第三行。当我玩过这个服务器函数时,我可以让响应结束并显示一条消息,而不是特别是我应该从 PHP 文件中获取的 JSON 响应。
  • 没有任何数据/块您想要/需要的东西很难帮助您。 (或真实的例子)。顺便提一句。您将响应标头设置为“text/plain”,为什么不设置“application/json”?
  • @Marc jarrenmorris.com/gamesense/r6_db/1.json 例如。 JSON到底是什么并不重要,但无论是返回JSON的php脚本还是实际的json文件本身,我都会得到相同的结果。使用我拥有的当前代码,我的浏览器只是说请求超时。响应头现在是“text/plain”,因为我使用消息变量来输出其他信息以进行调试。

标签: javascript node.js https cpanel


【解决方案1】:

服务器代码:

var http = require('http');
var https = require("https");

var server = http.createServer(function (req, res) {

    let call = new Promise((resolve, reject) => {

        var options = {
            host: "jarrenmorris.com",
            port: 443,
            path: '/gamesense/r6_db/1.json'
        };

        https.get(options, function (res) {

            var bodyChunks = [];

            res.on('data', function (chunk) {
                bodyChunks.push(chunk);
            }).on('end', function () {
                resolve(Buffer.concat(bodyChunks));
            });

        }).on('error', function (e) {
            reject(e);
        });

    });


    call.then((data) => {

        // do something here with the successful request/json

        res.writeHead(200, {
            'Content-Type': 'text/plain'
        });

        res.end(data);

    }).catch((err) => {

        // do something here with the failure request/json
        // res.write("ERROR:");
        res.end(err);

    });

});

server.listen(8081, "127.0.0.1", () => {
    console.log(`Server listen on ${server.address().address}:${server.address().port} `);
});

回复:

{"name":"tim","age":"42"}

我注意到的第一件事是,当我尝试运行您的代码时,您无法建立与 node.js 的连接。

原因是您使用了https 模块,但没有指定证书/密钥文件。跳过这个,使用http 直到你得到你想要的结果。

然后我将您对外部 api/文件的 https 请求包装在一个承诺中。 这允许简单的链接和更好的代码可读性。

当 Promise 解析/完成时,我们会使用从外部请求中收到的数据来响应 http 服务器上的请求。

你的代码中的res.end 没有意义,因为你没有等待外部请求完成。这就是为什么它在浏览器窗口中不显示任何内容的原因。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2018-01-28
    • 2018-01-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-07-15
    • 1970-01-01
    • 2012-02-22
    相关资源
    最近更新 更多