简体   繁体   中英

Weather Data in express and node.js not printing in my command line

const { response } = require("response");
const express = require("express);
const https = require("https")
const app = express ();
app.get("/", function(req,res) {
const url = "https://api.openweathermap.org/data/2.5/weather?q=London&applied=536bcef96b2f01cd9b9f076db90807fe&unit=metric";
https.get(url, function(response) {
console.log(response.statusCode);
})
response.on("data", function(data) {
const weatherData = JSON.parse(data)
console.log(weatherData);
})
res.send("Welcome to the future");
})
app.listen(3000,function() {
console.log("listening on port 3000")`;
})

The problem here is that when I type response.on to get data from the url to print it in the command line, it brings const { response } = require ("express") as shown above which is very alien to me. Please, how do I fix it so I can get my weatherData printed in the CMD?

There are quite a few things you'll need to change.

First, this section is wrong:

https.get(url, function(response) {
    console.log(response.statusCode);
})
response.on("data", function(data) {
    const weatherData = JSON.parse(data)
    console.log(weatherData);
})

Since "response" is a parameter you receive from the callback on the "get" function, you need to declare the "response.on" inside the funcion scope, like this:

https.get(url, function(response) {
    console.log(response.statusCode);

    response.on("data", function(data) {
        const weatherData = JSON.parse(data)
        console.log(weatherData);
    })
})

Also, the "data" event only delivers a chunk of data. You should be listening for an "end" event aswell, and only parse the data when you receive the "end" event

https.get(url, function(response) {
    console.log(response.statusCode);
    const result = []
    response.on("data", function(data) {
        result.push(data);
    })
    .on("end", function() {
        const weatherData = JSON.parse(result.join(""));
        console.log(weatherData);
    })
})

And since you're not using the module named "response", you also need to remove this:

const { response } = require("response");

And then correct all the typos that were already mentioned in the comments, which were:

  1. Add the missing quote " at require("express) on line 2
  2. Remove the extra backsting at console.log("listening on port 3000")`; on line 17
  3. Change the second query parameter on your URL on line 6 from "applied" to "appid"

First confirm your url is valid

https://api.openweathermap.org/data/2.5/weather?q=London&appid=536bcef96b2f01cd9b9f076db90807fe&unit=metric

If you are using windows 10 or 11 you don't need all those responses simply try this at cmd line ( NOTE you need for each & within the url to escape with ^ like this ^& )

curl -o current.txt https://api.openweathermap.org/data/2.5/weather?q=London^&appid=536bcef96b2f01cd9b9f076db90807fe^&unit=metric

type current.txt

you could include both in one line but for the &type that last & does not need ^escape

curl -o current.txt https://api.openweathermap.org/data/2.5/weather?q=London^&appid=536bcef96b2f01cd9b9f076db90807fe^&unit=metric&type current.txt

after the download you should see the response in the console.

so you can call that command any way you wish (hidden or not) and or read the text file on the screen or in any application you choose.

Current.txt

{"coord":{"lon":-0.1257,"lat":51.5085},"weather":[{"id":800,"main":"Clear","description":"clear sky","icon":"01n"}],"base":"stations","main":{"temp":276.78,"feels_like":272.23,"temp_min":275.76,"temp_max":278.14,"pressure":999,"humidity":84},"visibility":10000,"wind":{"speed":6.17,"deg":250},"clouds":{"all":9},"dt":1641696366,"sys":{"type":2,"id":2019646,"country":"GB","sunrise":1641715415,"sunset":1641744666},"timezone":0,"id":2643743,"name":"London","cod":200}

Here's a fairly simple version using the got() library for making the http request. It's a promise-based, higher level library that is just a lot easier to use than the https library which works at a lower level and requires more code to work properly and handle errors.

Here's how you would do this with the got() library:

const got = require("got");
const express = require("express");
const app = express();

app.get("/", async function(req, res) {
    try {
        const url = "https://api.openweathermap.org/data/2.5/weather?q=London&appid=536bcef96b2f01cd9b9f076db90807fe&unit=metric";
        const result = await got(url).json();
        console.log(result);
        res.json(result);
    } catch (e) {
        console.log(e);
        res.sendStatus(500);
    }
});

app.listen(3000, function() {
    console.log("listening on port 3000");
});

Changes:

  1. Fixed URL (change applied to appid ).
  2. Switch to got() library for the http request and built in JSON parsing
  3. Add error handling
  4. Send result as JSON

This generates the following output:

{
  coord: { lon: -0.1257, lat: 51.5085 },
  weather: [ { id: 800, main: 'Clear', description: 'clear sky', icon: '01n' } ],
  base: 'stations',
  main: {
    temp: 276,
    feels_like: 271.47,
    temp_min: 274.33,
    temp_max: 277.49,
    pressure: 1000,
    humidity: 86
  },
  visibility: 10000,
  wind: { speed: 5.66, deg: 250 },
  clouds: { all: 8 },
  dt: 1641707384,
  sys: {
    type: 2,
    id: 2019646,
    country: 'GB',
    sunrise: 1641715415,
    sunset: 1641744666
  },
  timezone: 0,
  id: 2643743,
  name: 'London',
  cod: 200
}

You need to close the string for express in const express = require("express);

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM