【问题标题】:How to make call to external api from nodejs如何从nodejs调用外部api
【发布时间】:2020-02-23 20:09:16
【问题描述】:

大家好,我必须开发一个实用程序来调用具有不同参数的外部 API,例如,我有一个数组 val,它有 100 个值 val= ['we23','22ww', 'gh22'.. ..n] 和 URL:www.google.com 所以我必须将值从 val 附加到 URL,第一个 api= www.google.com/we23,第二个 api= www.google.com/22ww 并制作外部 API 命中,然后将响应存储在数据库中。那么最有效的方法是什么?以及指向工作示例的链接会很有帮助。

【问题讨论】:

    标签: javascript node.js


    【解决方案1】:

    一个使用 Fetch API 的非常简单的快递应用示例:

    const express = require('express')
    const fetch = require('node-fetch')
    const app = express()
    
    // This sets up a route to localhost:3000/random and goes off and hits
    // cat-fact.herokuapp.com/facts/random
    app.get('/:apiRoute', async (req, res) => {
      try {
        const { apiRoute } = req.params
        const apiResponse = await fetch(
          'https://cat-fact.herokuapp.com/facts/' + apiRoute
        )
        const apiResponseJson = await apiResponse.json()
        // await db.collection('collection').insertOne(apiResponseJson)
        console.log(apiResponseJson)
        res.send('Done – check console log')
      } catch (err) {
        console.log(err)
        res.status(500).send('Something went wrong')
      }
    })
    
    app.listen(3000, () => console.log(`Example app listening on port 3000!`))
    
    

    访问http://localhost:3000/random

    【讨论】:

    • 嗨,安迪,谢谢您的回复。请确认一件事,上面使用的 fetch 函数来自 node-fetch 包?
    • 此外,当我使用 node-fetch 包执行上述代码时,我在 apiResponse 中得到 Promise { <pending>}
    • node-fetch 可以正常工作 :) 抱歉 - 我在 apiResponse.json() 之前错过了 await。使用有效的 API 编辑我的答案以进行测试。
    • 很好,很高兴它成功了。如果可能,不要忘记标记为已解决,这样我就会得到那个光荣的绿色勾号;)
    • 注意:使用最新的 node-fetch 模块(3.x 及更高版本)需要您的 Node.js 服务器上的 ESM 结构。如果你使用require("..")而不是import .. from ..风格,你使用的是CJS结构,你必须像这样安装版本2:npm install node-fetch@2。现在您可以像在这个答案中一样包含它:const fetch = require('node-fetch')
    【解决方案2】:

    通过以下代码,您可以使用 Node.js + Express 在端点内进行并发 API 调用:

    const [
          LoMasNuevo, LoMasVisto, TeRecomendamos, Categorias,
        ] = await Promise.all([
          numerosController.getLoMasNuevo(),
          numerosController.getLoMasVisto(),
          numerosController.getRecomendaciones(),
          categoriasController.getCategorias(),
        ]);

    在每个 get 函数中,您可以像这样发出 axios 请求:

    const params = {
        method: 'GET',
        url: 'https://development.api.yodlee.com/ysl/transactions',
        headers: {
            'Api-Version': '1.1',
            Authorization: `Bearer ${tokenuser}`,
        },
    };
    
    const data = await axios(params);
    return data;

    【讨论】:

      【解决方案3】:
      • 您可以根据自己的想法使用Express 构建 API
      • 然后就可以使用axios包调用api了。
      • 另外,您可以使用ExpressJS的Router构建link来接收请求和发送响应

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2019-01-15
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2022-08-06
        • 1970-01-01
        • 2018-05-24
        • 1970-01-01
        相关资源
        最近更新 更多