Read the statement by Michael Teeuw here.
CORS using node_helper.js for Uber and Lyft APIs
-
@cowboysdude isn’t that what I am doing? Can you explain how your solution differs from mine?
-
When you request a webpage, your browser sends a number of headers to the server hosting the site that you’re visiting.
These headers occur during a negotiation process that helps the browser and the hosting server determine the best way to provide the requested information. The user-agent header identifies the application requesting the information from the server, typically a browser. This identification string is called the user-agent string and contains tokens that provide specific details about the program making the request.
-
@cowboysdude I don’t think the user-agent string is required when making an HTTP request. According to the Uber API docs it doesn’t look like I need one.
-
@kal well then… I know its not helping, but it should work as you described. Not seeing anything in js console is a serious problem when developing. Did you try other browsers? If nothing appears in any browser AND on raspberry itself (with
npm start dev
), then something is seriously wrong… -
I was able to fix this. See below for the module code
/* global Module */ /* Magic Mirror * Module: Uber * * Shows the time and surge pricing for UberX * * By Kyle Kelly * based on MagicMirror work by Michael Teeuw http://michaelteeuw.nl * and by derickson https://github.com/derickson/MMderickson/tree/master/uber * MIT Licensed. */ Module.register("MMM-uber",{ // Default module config. defaults: { lat: null, lng: null, ride_type: "uberX", uberServerToken: null, updateInterval: 5 * 60 * 1000, // every 5 minutes animationSpeed: 1000, }, // Define required scripts. getScripts: function() { return ["moment.js", "https://code.jquery.com/jquery-2.2.3.min.js"]; }, // Define required styles. getStyles: function() { return ["MMM-uber.css"]; }, start: function() { Log.info("Starting module: " + this.name); // Set locale. moment.locale(config.language); // variables that will be loaded from service this.uberTime = null; this.uberSurge = null; this.loaded = false; Log.log("Sending CONFIG to node_helper.js in " + this.name); Log.log("Payload: " + this.config) this.sendSocketNotification('CONFIG', this.config); }, // unload the results from uber services processUber: function(FLAG, result) { var self = this; Log.log("ProcessUber"); // go through the time data to find the uberX product if (FLAG === "TIME"){ Log.log("Time:"); Log.log(result); for (var i = 0, count = result.times.length; i < count ; i++) { var rtime = result.times[i]; if(rtime.display_name === this.config.ride_type){ // convert estimated seconds to minutes this.uberTime = rtime.estimate / 60; break; } } } // go through the price data to find the uberX product else if (FLAG === "PRICE"){ Log.log("Price:"); Log.log(result); for( var i=0, count = result.prices.length; i< count; i++) { var rprice = result.prices[i]; if(rprice.display_name === this.config.ride_type){ // grab the surge pricing this.uberSurge = rprice.surge_multiplier; break; } } } }, // Override dom generator. getDom: function() { var wrapper = document.createElement("div"); var uber = document.createElement("div"); uber.className = "uberButton"; var uberIcon = document.createElement("img"); uberIcon.className = "badge"; uberIcon.src = "modules/MMM-uber/UBER_API_Badges_1x_22px.png"; var uberText = document.createElement("span"); if(this.loaded) { var myText = this.config.ride_type + " in "+ this.uberTime +" min "; Log.log("ubersurge: " + this.uberSurge); // only show the surge pricing if it is above 1.0 if(typeof this.uberSurge !== "undefined" && this.uberSurge > 1.0){ myText += " - " + this.uberSurge + "X surge pricing"; } uberText.innerHTML = myText; } else { // Loading message uberText.innerHTML = "Checking Uber status ..."; } uber.appendChild(uberIcon); uber.appendChild(uberText); wrapper.appendChild(uber); return wrapper; }, socketNotificationReceived: function(notification, payload) { Log.log(this.name + " received a socket notification: " + notification + " - Payload: " + payload); if (notification === "TIME") { this.processUber("TIME", JSON.parse(payload)); this.updateDom(this.config.animationSpeed) } else if (notification === "PRICE") { this.processUber("PRICE", JSON.parse(payload)); this.loaded = true; this.updateDom(this.config.animationSpeed); } } });
and the node_helper.js code
'use strict'; /* Magic Mirror * Module: MMM-uber * * By Kyle Kelly * MIT Licensed. */ const NodeHelper = require('node_helper'); var request = require('request'); var moment = require('moment'); module.exports = NodeHelper.create({ start: function() { var self = this; console.log("Starting node helper for: " + this.name); this.config = null; }, getData: function() { var self = this; this.sendSocketNotification("Test", 2); this.sendSocketNotification("LATITUDE", this.config.lat); this.sendSocketNotification("LONGITUDE", this.config.lng); request({ url: "https://api.uber.com/v1/estimates/time?start_latitude=" + this.config.lat + "&start_longitude=" + this.config.lng, method: 'GET', headers: { 'Authorization': 'Token ' + this.config.uberServerToken, 'Accept-Language': 'en_US', 'Content-Type': 'application/json' }, }, function (error, response, body) { if (!error && response.statusCode == 200) { self.sendSocketNotification("TIME", body); } else { self.sendSocketNotification("ERROR", "In TIME request with status code: " + response.statusCode); } }); request({ url: "https://api.uber.com/v1/estimates/price?start_latitude=" + this.config.lat + "&start_longitude=" + this.config.lng + "&end_latitude=" + this.config.lat + "&end_longitude=" + this.config.lng, method: 'GET', headers: { 'Authorization': 'Token ' + this.config.uberServerToken, 'Accept-Language': 'en_US', 'Content-Type': 'application/json' }, }, function (error, response, body) { if (!error && response.statusCode == 200) { self.sendSocketNotification("PRICE", body); } else { self.sendSocketNotification("ERROR", "In PRICE request with status code: " + response.statusCode); } }); setTimeout(function() { self.getData(); }, this.config.updateInterval); }, socketNotificationReceived: function(notification, payload) { //var self = this; this.sendSocketNotification("Test", 0); if (notification === 'CONFIG') { this.sendSocketNotification("Test", 1); this.config = payload; this.getData(); } } });