tuniq
What is folding?
Boas,
Estou a desenvolver uma webapp em Nodejs com Express e tou aqui com uma duvida sobre qual é a melhor prática a usar. A app consiste numa API e em 2 páginas web. A estrutura da app que tou a usar é:
- Modelos (onde defino funções/constantes para diversos componentes; ie: weather)
- Routes (onde defino as rotas, = modelos + index)
Alguns dos modelos fazem pedidos a API's externas. Isto significa que, quando faço um pedido à minha API (ie: GET /api/weather/forecast), no lado do servidor é feito um pedido a uma API externa (neste caso, de meteorologia).
Deixo aqui o código deste exemplo:
- No modelo weather (Weather.getForecast(lat,lng))
- Na route weather (/api/weather/forecast)
Das 2 páginas web da app, uma é de login, a outra é o conteúdo em si. Podemos considerar que é basicamente só uma página. Quando essa página é apresentada pela primeira vez, é necessário fazer uma certa quantidade de pedidos (neste momento são 4, mas podem vir a ser muitos mais). As possíveis soluções que descobri foram:
1. Fazer esses pedidos no lado do cliente (ajax)
2. Fazer esses pedidos no lado do servidor (request/fetch)
3. Utilizar directamente as funções dos modelos e não fazer qualquer pedido
Neste momento, estou a usar a opção 3. A minha duvida é: Qual é a melhor pratica num caso destes ? Devo usar sempre a API ou posso usar directamente os modelos como estou a fazer ?
Ja agora, deixo um bocado do código da rota index que mostra como vou buscar os dados aos modelos.
Estou a desenvolver uma webapp em Nodejs com Express e tou aqui com uma duvida sobre qual é a melhor prática a usar. A app consiste numa API e em 2 páginas web. A estrutura da app que tou a usar é:
- Modelos (onde defino funções/constantes para diversos componentes; ie: weather)
- Routes (onde defino as rotas, = modelos + index)
Alguns dos modelos fazem pedidos a API's externas. Isto significa que, quando faço um pedido à minha API (ie: GET /api/weather/forecast), no lado do servidor é feito um pedido a uma API externa (neste caso, de meteorologia).
Deixo aqui o código deste exemplo:
- No modelo weather (Weather.getForecast(lat,lng))
Código:
getForecast(lat, lng) {
const options = {
uri: `http://api.wunderground.com/api/${this.apiKey}/forecast/q/${lat},${lng}.json`,
json: true,
};
return new Promise((resolve, reject) => {
*****(options)
.then(res => resolve(res.forecast.simpleforecast))
.catch(err => reject(err));
});
}
- Na route weather (/api/weather/forecast)
Código:
router.get('/forecast', (req, res) => {
// parte do código removida
Weather.getForecast(location.lat, location.lng)
.then(forecast => res.status(200).send(forecast))
.catch(err => res.status(500).json({ status: err });
});
Das 2 páginas web da app, uma é de login, a outra é o conteúdo em si. Podemos considerar que é basicamente só uma página. Quando essa página é apresentada pela primeira vez, é necessário fazer uma certa quantidade de pedidos (neste momento são 4, mas podem vir a ser muitos mais). As possíveis soluções que descobri foram:
1. Fazer esses pedidos no lado do cliente (ajax)
2. Fazer esses pedidos no lado do servidor (request/fetch)
3. Utilizar directamente as funções dos modelos e não fazer qualquer pedido
Neste momento, estou a usar a opção 3. A minha duvida é: Qual é a melhor pratica num caso destes ? Devo usar sempre a API ou posso usar directamente os modelos como estou a fazer ?
Ja agora, deixo um bocado do código da rota index que mostra como vou buscar os dados aos modelos.
Código:
router.get('/dashboard', (req, res) => {
const promises = [
TvShows.getTvShows(userSettings.tvshows.shows),
Movies.getMovies(),
Weather.getConditions(userSettings.weather.location.lat, userSettings.weather.location.lng),
Weather.getForecast(userSettings.weather.location.lat, userSettings.weather.location.lng),
];
return Promise.all(promises.map(promise => promise.reflect()))
.then(([tvList, moviesList, weatherConditions, weatherForecast]) => {
const errors = {};
(!tvList.isFulfilled()) ? errors.tvList = true : tvList = tvList.value();
(!moviesList.isFulfilled()) ? errors.moviesList = true : moviesList = moviesList.value();
(!weatherConditions.isFulfilled()) ? errors.weatherConditions = true : weatherConditions = weatherConditions.value();
(!weatherForecast.isFulfilled()) ? errors.weatherForecast = true : weatherForecast = weatherForecast.value();
res.render('dashboard', {
title: 'Dashboard - Main',
user: {
username: userSettings.username,
},
tv: {
days: Utils.getListOfFiveDays(5, -2, 'D MMM'),
list: tvList,
settings: userSettings.tvshows.shows,
},
weather: {
days: Utils.getListOfFiveDays(4, 0, 'ddd, D MMM'),
conditions: weatherConditions,
forecast: weatherForecast,
},
movies: {
list: moviesList,
},
errors,
});
})
.catch((err) => {
console.log(err);
});
});