Read the statement by Michael Teeuw here.
ECONNREFUSED when trying to get JSON from my server (MMM-json-feed)
-
Hi all,
I like to display a simple value that can be fetched from a JSON service. So I started with the MMM-json-feed module which is pretty much doing the trick with some test services that I found (e.g. http://ip.jsontest.com/).
It seemed to need just a simple adaptation of the config file, to load the JSON data from an URL in my private network.
Unfortunately this does not work, although my JSON service returns proper data (checked with my browser). The mm output isMMM-json-feed sending request: GET http://raspberrypi.fritz.box/temp/ MMM-json-feed received MMM-json-feed Error: connect ECONNREFUSED 192.168.178.33:80 Whoops! There was an uncaught exception... TypeError: Cannot read property 'statusCode' of undefined at Request._callback (/home/pi/MagicMirror/modules/MMM-json-feed/node_helper.js:15:48) at self.callback (/home/pi/MagicMirror/node_modules/request/request.js:186:22) at emitOne (events.js:96:13) at Request.emit (events.js:191:7) at Request.onRequestError (/home/pi/MagicMirror/node_modules/request/request.js:878:8) at emitOne (events.js:96:13) at ClientRequest.emit (events.js:191:7) at Socket.socketErrorListener (_http_client.js:358:9) at emitOne (events.js:96:13) at Socket.emit (events.js:191:7) MagicMirror will not quit, but it might be a good idea to check why this happened. Maybe no internet connection? If you think this really is an issue, please open an issue on GitHub: https://github.com/MichMich/MagicMirror/issues
I thought it might relate to CORS and compared the headers of the JSONTest (http://ip.jsontest.com) and my JSON service. They both look quite similar. Nothing that make me believe there is something missing.
JSONTest:Access-Control-Allow-Origin: * Cache-Control: private Content-Encoding: gzip Content-Length: 67 Content-Type: application/json; charset=ISO-8859-1 Date: Wed, 21 Feb 2018 21:08:30 GMT Server: Google Frontend Vary: Accept-Encoding X-Cloud-Trace-Context: f1d4981eae5655f530221b705a794f51 Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8 Accept-Encoding: gzip, deflate Accept-Language: de,en-US;q=0.7,en;q=0.3 Connection: keep-alive Host: ip.jsontest.com Upgrade-Insecure-Requests: 1 User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:58.0) Gecko/20100101 Firefox/58.0
My service:
Access-Control-Allow-Origin: * Content-Length: 64 Content-Type: application/json Date: Wed, 21 Feb 2018 21:08:06 GMT Server: CherryPy/13.1.0 Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8 Accept-Encoding: gzip, deflate Accept-Language: de,en-US;q=0.7,en;q=0.3 Cache-Control: max-age=0 Connection: keep-alive Host: raspberrypi.fritz.box Upgrade-Insecure-Requests: 1 User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:58.0) Gecko/20100101 Firefox/58.0
Any guesses?
-
@toh1000 Please post JSON response. I just spent a day trying to figure out why MM is so fickly regarding non-perfect JSON being sent over the socket. Loading JSON from a variable, just fine. Pushing the exact same JSON over a socket…had problems.
BTW. Is it correct that it says your JSON is GZIP encoded, no??
-
-
@E3V3A Also, @toh1000’s HTTP request included the header
Accept-Encoding: gzip, deflate
, so the test site responded withContent-Encoding: gzip
. That’s totally appropriate, and usually this is handled transparently by the client, which will then provide the uncompressed response. However, the actual service (“My service”) responded with no compression. -
From here:
ECONNREFUSED (Connection refused): No connection could be made because the target machine actively refused it. This usually results from trying to connect to a service that is inactive on the foreign host.
-
Here’s an example in my node helper I use to get json
request({ url: "xxxxxxxxxxxx.json", method: 'GET', headers: { 'User-Agent': 'MagicMirror/1.0 (' + this.config.email + ')' }
-
@ninjabreadman Yes, curl call returns correct json:
{"Date": "22.02.2018", "Temperature": -0.187, "Time": "22:45:37"}
-
@E3V3A Any idea what I could do to accept the connection?
-
@cowboysdude I added the header (without the this.config.email) but got the same result.
-
Solved:
The problem was that the module translated the server name into an up address and CherryPy was not configured to response to that.
Reconfiguring did the trick:
this article explains how this is done
Thanks for your efforts.