node bluemix app javascript json node.js http ibm-cloud

javascript - app - node js bluemix



Error del nodo js: no se admite el protocolo "https:". Se esperaba "http:" (3)

Como nota al margen a cualquiera que busque una solución de Google ... asegúrese de no estar utilizando un http.Agent con una solicitud https o recibirá este error.

Estoy usando IBM Bluemix para hacer un servicio web para un proyecto escolar.

Mi proyecto necesita solicitar un JSON de una API, para poder usar los datos que proporciona. Utilizo el método http get para un conjunto de datos, y no estoy seguro de si funciona correctamente.

Cuando ejecuto mi código, recibo el mensaje:

Error: el protocolo "https:" no es compatible. Se esperaba "http:"

¿Qué lo está causando y cómo puedo resolverlo?

Aquí está mi archivo .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); }); }); }); }); }); });

Aquí hay una impresión de la pantalla de error que obtengo:



La razón de este error es que está intentando llamar a un URI HTTPS desde un cliente HTTP. La solución ideal hubiera sido que un módulo genérico descubriera el protocolo URI y tomara la decisión de usar HTTPS o HTTP internamente.

La forma en que superé este problema es usando la lógica de conmutación por mi cuenta. A continuación hay un código que hizo el cambio por mí.

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