【问题标题】:Unable to query restful api to output json object in nodejs无法查询restful api以在nodejs中输出json对象
【发布时间】:2021-05-13 13:55:33
【问题描述】:

我正在构建一个安静的 API 来从外部 API (https://api.exchangeratesapi.io/latest) 获取数据。抓取成功。但是,我想要这样一种情况,如果你像这样查询“/api/rates?currency=EUR,GBP,USD”,你会得到

"rates": {
   "EUR": 0.0377244605,
   "GBP": 0.033795458,
   "USD": 0.044824204
}

如果没有查询参数,则返回所有费率。 当存在查询参数时,我尝试使用三元运算符提取数字,但出现错误“TypeError: Cannot read property 'rates' of 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;

【问题讨论】:

  • queryParameter.currency.rates 返回未定义的@Mike Malyi。我不知道为什么我被阻止在您的评论下发表评论。

标签: javascript node.js json api express


【解决方案1】:

解决方案。我的 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 && !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}`);
})

【讨论】:

    【解决方案2】:

    我可以看到您正在尝试过滤响应。最好将您的查询参数注入到您的外部 api 调用中。

    您期望 currency 在您的 api 上作为查询参数 /api/rates?currency=EUR,GBP,USD。在currency 下没有response 这就是为什么queryParameter.currency.ratesundefined

    根据https://exchangeratesapi.io/,你可以使用symbols来达到同样的效果:

    GET https://api.exchangeratesapi.io/latest?symbols=USD,GBPHTTP/1.1

    您可以使用与您的外部 api 相同的查询参数,并使用函数将它们注入外部调用

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-06-07
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-01-30
      • 1970-01-01
      相关资源
      最近更新 更多