Knoten js Fehler: Protokoll "https:" wird nicht unterstützt. Erwartetes "http:"

75

Ich verwende IBM Bluemix, um einen Webdienst für ein Schulprojekt zu erstellen.

Mein Projekt muss einen JSON von einer API anfordern, damit ich die darin bereitgestellten Daten verwenden kann. Ich verwende die http getMethode für einen Datensatz und bin mir nicht sicher, ob sie ordnungsgemäß funktioniert.

Wenn ich meinen Code ausführe, erhalte ich folgende Meldung:

Fehler: Protokoll "https:" wird nicht unterstützt. Erwartetes "http:"

Was verursacht es und wie kann ich es lösen?

Hier ist meine .jsDatei:

// 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); });

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

Hier ist ein Ausdruck des Fehlerbildschirms, den ich erhalte: Geben Sie hier die Bildbeschreibung ein

MBBertolucci
quelle

Antworten:

137

Wenn Sie eine https-Ressource anfordern möchten, müssen Sie diese https.getnicht verwenden http.get.

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

Epascarello
quelle
110
Warum wird diese Entscheidung auf den Benutzer verschoben? Es scheint vernünftig, nur das Protokoll zu analysieren und hinter den Kulissen eine geeignete Funktion zu verwenden.
Peter Klipfel
7
Äh, okay? Ich verstehe nicht, warum dies vom Benutzer zu entscheiden ist.
BastiBen
4
Das ist ja zum verrückt werden. Wie bekomme ich die letzten zwei Stunden meines Lebens zurück?
pdoherty926
35

Als Randnotiz für alle, die nach einer Lösung von Google suchen ... stellen Sie sicher, dass Sie keine http.Agentmit einer httpsAnfrage verwenden, da sonst dieser Fehler angezeigt wird.

user169771
quelle
25

Der Grund für diesen Fehler ist, dass Sie versuchen, einen HTTPS-URI von einem HTTP-Client aufzurufen. Die ideale Lösung wäre gewesen, wenn ein generisches Modul das URI-Protokoll herausgefunden und die Entscheidung getroffen hätte, HTTPS oder HTTP intern zu verwenden.

Ich habe dieses Problem überwunden, indem ich die Schaltlogik selbst verwendet habe. Unten ist ein Code, der die Umschaltung für mich durchgeführt hat.

    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);
    });
Sarath.B
quelle