Невозможно запросить restful api для вывода объекта json в nodejs

#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}`);
})