Помилка Node js: Протокол “https:” не підтримується. Очікуваний “http:”


78

Я використовую IBM Bluemix для створення веб-служби для шкільного проекту.

Мій проект повинен запитувати JSON з API, щоб я міг використовувати дані, які він надає. Я використовую http getметод для набору даних, і я не впевнений, що він працює належним чином.

Коли я запускаю свій код, я отримую повідомлення:

Помилка: протокол "https:" не підтримується. Очікуваний "http:"

Що спричиняє це та як я можу це вирішити?

Ось мій .jsфайл:

// Hello.
//
// This is JSHint, a tool that helps to detect errors and potential
// problems in your JavaScript code.
//
// To start, simply enter some JavaScript anywhere on this page. Your
// report will appear on the right side.
//
// Additionally, you can toggle specific options in the Configure
// menu.

function main() {
  return 'Hello, World!';
}

main();/*eslint-env node*/

//------------------------------------------------------------------------------
// node.js starter application for Bluemix
//------------------------------------------------------------------------------

// HTTP request - duas alternativas
var http = require('http');
var request = require('request');

// cfenv provides access to your Cloud Foundry environment
// for more info, see: https://www.npmjs.com/package/cfenv
var cfenv = require('cfenv');

//chama o express, que abre o servidor
var express = require('express');

// create a new express server 
var app = express();

// serve the files out of ./public as our main files
app.use(express.static(__dirname + '/public'));

// get the app environment from Cloud Foundry
var appEnv = cfenv.getAppEnv();

// start server on the specified port and binding host
app.listen(appEnv.port, '0.0.0.0', function() {
    // print a message when the server starts listening
    console.log("server starting on " + appEnv.url);
});


app.get('/home1', function (req,res) {
    http.get('http://developers.agenciaideias.com.br/cotacoes/json', function (res2) {
        var body = '';
        res2.on('data', function (chunk) {
            body += chunk;
        });
        res2.on('end', function () {
            var json = JSON.parse(body);
            var CotacaoDolar = json["dolar"]["cotacao"];
            var VariacaoDolar = json["dolar"]["variacao"];
            var CotacaoEuro = json["euro"]["cotacao"];
            var VariacaoEuro = json["euro"]["variacao"];
            var Atualizacao = json["atualizacao"];

            obj=req.query; 

            DolarUsuario=obj['dolar'];
            RealUsuario=Number(obj['dolar'])*CotacaoDolar;

            EuroUsuario=obj['euro'];
            RealUsuario2=Number(obj['euro'])*CotacaoEuro;

            Oi=1*VariacaoDolar;
            Oi2=1*VariacaoEuro;

            if (VariacaoDolar<0) {
            recomend= "Recomenda-se, portanto, comprar dólares.";
            }

            else if (VariacaoDolar=0){
                recomend="";
            }

            else {
                recomend="Recomenda-se, portanto, vender dólares.";
                  }

            if (VariacaoEuro<0) {
            recomend2= "Recomenda-se, portanto, comprar euros.";
            }

            else if (VariacaoEuro=0){
                recomend2="";
            }
            else {
                recomend2="Recomenda-se,portanto, vender euros.";
                  }   

            res.render('cotacao_response.jade', {
                         'CotacaoDolar':CotacaoDolar,
                        'VariacaoDolar':VariacaoDolar,
                        'Atualizacao':Atualizacao,
                        'RealUsuario':RealUsuario,
                        'DolarUsuario':DolarUsuario,
                        'CotacaoEuro':CotacaoEuro,
                        'VariacaoEuro':VariacaoEuro,
                        'RealUsuario2':RealUsuario2,
                        'recomend':recomend,
                        'recomend2':recomend2,
                        'Oi':Oi,
                        'Oi2':Oi2
            });

        app.get('/home2', function (req,res) {
    http.get('https://www.quandl.com/api/v3/datasets/BCB/432.json?api_key=d1HxqKq2esLRKDmZSHR2', function (res3) {
        var body = '';
        res3.on('data', function (chunk) {
            body += chunk;
        });
        res3.on('end', function () {
            var x=json.dataset.data[0][1];
      console.log("My JSON is "+x); });

    });
    });
        });
    });
});

Ось друк екрана з помилками, який я отримую: введіть тут опис зображення

Відповіді:


138

Коли ви хочете запитати https-ресурс, вам потрібно використовувати https.get, а не http.get.

https://nodejs.org/api/https.html


112
Чому це рішення відсувається користувачеві? Здається, було б розумно просто проаналізувати протокол і використовувати відповідну функцію за кадром.
Пітер Кліпфел,

8
Гаразд? Я не розумію, чому це повинен вирішити користувач.
BastiBen

4
Це божевільне. Як повернути останні дві години свого життя?
pdoherty926

35

Як допоміжне зауваження для тих, хто шукає рішення від Google ... переконайтесь, що ви не використовуєте http.Agentіз httpsзапитом, інакше ви отримаєте цю помилку.


27

Причиною цієї помилки є те, що ви намагаєтесь викликати HTTPS URI з клієнта HTTP. Ідеальним рішенням було б для загального модуля з’ясувати протокол URI та прийняти рішення про використання HTTPS або HTTP внутрішньо.

Я подолав цю проблему, використовуючи логіку перемикання самостійно. Нижче наведено код, який замінив мене.

    var http = require('http');
    var https = require('https');
    // Setting http to be the default client to retrieve the URI.
    var url = new URL("https://www.google.com")
    var client = http; /* default  client */
    // You can use url.protocol as well 
    /*if (url.toString().indexOf("https") === 0){
                client = https;
    }*/
    /* Enhancement : using the  URL.protocol  parameter
     * the  URL  object ,  provides a  parameter url.protocol that gives you 
     * the protocol  value  ( determined  by the  protocol ID  before 
     * the ":" in the  url. 
     * This makes it easier to  determine the protocol, and to  support other  
     * protocols like ftp ,  file  etc) 
     */
   client=(url.protocol=="https") ? https:client; 
    // Now the client is loaded with the correct Client to retrieve the URI.
    var req = client.get(url, function(res){
        // Do what you wanted to do with the response 'res'.
        console.log(res);
    });

Має бутиclient = (url.protocol == "https:") ? https : client
OzrenTkalcecKrznaric
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.