web-dev-qa-db-fra.com

Node js Erreur: Protocole "https:" non pris en charge. Attendu "http:"

J'utilise IBM Bluemix pour créer un service Web pour un projet scolaire.

Mon projet doit demander un JSON à une API pour pouvoir utiliser les données qu'il fournit. Je utilise l http get méthode pour un ensemble de données, et je ne suis pas sûr qu'il fonctionne correctement.

Quand je lance mon code, je reçois le message:

Erreur: Le protocole "https:" n'est pas supporté. "Http:" attendu

Quelle en est la cause et comment puis-je le résoudre?

Voici mon .js fichier:

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

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

Voici une impression de l'écran d'erreur que je reçois: enter image description here

54
MBBertolucci

Lorsque vous souhaitez demander une ressource https, vous devez utiliser https.get, ne pas http.get.

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

114
epascarello

En guise de remarque pour ceux qui recherchent une solution de Google ... assurez-vous de ne pas utiliser un http.Agent avec une demande https, sinon vous obtiendrez cette erreur.

23
user169771

La raison de cette erreur est que vous essayez d'appeler un URI HTTPS à partir d'un client HTTP. La solution idéale aurait été pour un module générique de déterminer le protocole URI et de prendre la décision d'utiliser HTTPS ou HTTP en interne.

J'ai surmonté ce problème en utilisant moi-même la logique de commutation. Vous trouverez ci-dessous un code qui a changé pour moi.

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