#node.js #api #angular7
#node.js #API #angular7
Вопрос:
я попытался сделать свой собственный прогноз погоды. Я взял darksky для данных. Мой сервер является коротким node.js сервер с геоданными и частью прогноза.
Часть прогноза: …
const request = require('request');
const forecast = (latitude, longitude, callback) => {
const url =
darksky url
var weatherData = {};
request({ url, json: true }, (error, { body }) => {
if (error) {
callback('Unable to connect to weather service', undefined);
} else if (body.error) {
callback('Unable to find location', undefined);
} else {
callback(
undefined,
(weatherData = {
daily: body.daily.data[0].summary,
temp: body.currently.temperature,
regen: body.currently.precipProbability
})
);
}
});
};
module.exports = forecast;
…
сервер:
…
const express = require('express');
const cors = require('cors');
const bodyParser = require('body-parser');
const geocode = require('./utils/geocode');
const forecast = require('./utils/forecast');
const app = express();
const port = process.env.PORT || 3000;
app.use(cors());
app.use(bodyParser.json());
app.get('/', (req, res) => {
res.send('Hello World');
});
app.get('/weather', (req, res) => {
console.log(req.query.search);
geocode(req.query.search, (error, { latitude, longitude, location } = {}) => {
if (error) {
return res.send({ error });
}
forecast(latitude, longitude, (error, forecastData) => {
if (error) {
return res.send({ error });
}
const data =({
location,
forecast: forecastData
});
console.log(JSON.stringify(data));
res.send(JSON.stringify(data));
});
});
});
app.listen(port, () => {
console.log("Server is up and running");
});
…
Теперь я пытаюсь получить это в своем приложении angular 7.
Я создал сервис:
…
getDataServer(addy: string) {
return this.http.get(this.url addy).subscribe(responseData => {
console.log(responseData);
});
}
…
Responsedata содержит всю необходимую информацию в этом формате:
{местоположение: Штутгарт, трансляция: { ежедневно: ‘sun’, регенерация: 0, температура: 17}}
Теперь я попытался получить прогноз в своем компоненте, но это не сработает. Я попытался создать Observable и подписаться, но ничего не сработало.
Может быть, у вас есть небольшая подсказка,
Спасибо,
Том
Ответ №1:
Пожалуйста, измените свой сервисный код следующим образом
getDataServer(addy: string) {
return this.http.get(this.url addy).pipe(map(res => res.json()));
}
И вызывайте эту службу в вашем компоненте как
this.your_service_property.getDataServer(addy).subscribe(data => {
console.log(data);
// Try updating your html here
})
Ответ №2:
Спасибо, это была огромная помощь для меня. Я попробовал это почти таким же образом, но с вашей помощью я получил решение для службы, пришлось изменить его на:
getDataServer(addy: string) {
return this.http.get(this.url addy).pipe(map(res => res));
}
получено сообщение об ошибке от res.json(). HttpClient изменился, и я вернул объект json.
Следующая вещь в компоненте:
this.your_service_property.getDataServer(addy).subscribe((data: any) => {
console.log(data);
Пришлось использовать любое свойство для данных. Без этого я всегда получал ошибку типа
Свойство ‘location’ не существует для типа ‘Object’, если бы я попытался получить какое-либо значение из data — data.location. Пробовал это с интерфейсом, но все равно ошибка, поэтому я выбрал самый простой способ с любым, и это сработало.
Но часть с интерфейсом все еще у меня в голове, и я попробую это позже.