#javascript #node.js #json #api #express
#javascript #node.js #json #API #выразить
Вопрос:
Я создаю restful API для извлечения данных из внешнего API (https://api.exchangeratesapi.io/latest ). Выборка выполнена успешно. Однако я хочу ситуацию, в которой, если вы запросите что-то вроде «/ api / rates?currency = EUR, GBP, USD«, вы получите
"rates": {
"EUR": 0.0377244605,
"GBP": 0.033795458,
"USD": 0.044824204
}
И если параметр запроса отсутствует, будут возвращены все скорости.
Я попытался использовать троичный оператор для извлечения цифр при наличии параметра запроса, но я получаю сообщение об ошибке «TypeError: не удается прочитать свойство ‘rates’ из undefined»
Ниже приведен мой app.js файл
const express = require("express");
const request = require('request');
const apiCallFromRequest = require('./Requests')
const app = express();
const exchangeRouter = express.Router();
const port = process.env.PORT || 4001;
exchangeRouter.route(`/rates`)
.get((req, res) => {
const queryParameter = req.query;
// console.log(queryParameter.currency)
apiCallFromRequest.callApi(function(response) {
let cur = queryParameter.currency
res.json({
results: {
base: queryParameter.base ? queryParameter.base : response.base,
date: response.date,
rates: queryParameter.currency ? queryParameter.currency.response.rates : response.rates
}
})
res.end();
});
});
app.use('/api', exchangeRouter);
app.get('/', (req, res) => {
res.send('Welcome to my nodemon API')
});
app.listen(port, () => {
console.log(`Running on port ${port}`);
})
И мой Request.js файл
const request = require('request');
const URL = `https://api.exchangeratesapi.io/latest`;
const callExternalApiUsingRequest = (callback) => {
request(URL, { json: true }, (err, res, body) => {
if (err) {
return callback(err);
}
// console.log("body: ", body)
return callback({
base: body.base,
date: body.date,
rates: body.rates
});
});
}
module.exports.callApi = callExternalApiUsingRequest;
Комментарии:
1.
queryParameter.currency.rates
возвращает неопределенный @Mike Malyi. Я не знаю, почему мне запрещено комментировать ваш комментарий.
Ответ №1:
Как я вижу, вы пытаетесь отфильтровать ответ. Было бы лучше ввести параметры вашего запроса во внешний вызов api.
Вы ожидаете currency
в качестве параметра запроса /api/rates?currency=EUR,GBP,USD
в своем api. Нет response
under currency
вот почему queryParameter.currency.rates
undefined
Согласно https://exchangeratesapi.io / вы можете использовать symbols
для достижения того же результата:
ПОЛУЧИТЬ https://api.exchangeratesapi.io/latest?symbols=USD ,GBP HTTP/1.1
вы можете использовать те же параметры запроса, что и внешний API для вашего, и использовать функцию для их введения во внешний вызов
Ответ №2:
Решение. Мой app.js файл должен выглядеть следующим образом:
const express = require("express");
const request = require('request');
const apiCallFromRequest = require('./Requests')
const app = express();
const exchangeRouter = express.Router();
const port = process.env.PORT || 4001;
exchangeRouter.route(`/rates`)
.get((req, res) => {
apiCallFromRequest.callApi(function(response) {
if (!base amp;amp; !currency) {
return res.status(200).json({
results: {
"base": response.base,
"date": response.date,
"rates": response.rates
}
})
}
// If there is a query parameter but no value
if (!base) {
return res.status(400).json({ message: "Please specify your home currency" })
}
if (!currency) {
return res.status(400).json({ message: "Please specify exchange currency or currencies" })
}
// If there is query parameter and a value
const exchangeRates = currency.toUpperCase().split(',')
let currencyExchangeRates = {};
for (const exchangeRate of exchangeRates) {
//trim white space
const value = exchangeRate.trim();
currencyExchangeRates = { ...currencyExchangeRates, [value]: response.rates[value] }
}
console.log(currencyExchangeRates);
res.json({
results: {
"base": base,
"date": response.date,
"rates": currencyExchangeRates
}
})
res.end();
});
});
app.use('/api', exchangeRouter);
app.get('/', (req, res) => {
res.send('Welcome to my nodemon API')
});
app.listen(port, () => {
console.log(`Running on port ${port}`);
})