【问题标题】:How do I call a different REST API within a express route?如何在快速路由中调用不同的 REST API?
【发布时间】:2021-12-07 23:18:16
【问题描述】:

我有一个使用各种路由创建的 express.js REST API。我想创建一个路由来调用另一个 REST API,然后返回结果。理想情况下,它应该如下所示:

router.post('/CreateTicket', cors(corsOptions), function(req, res, next) {
   //make a call to another rest api and then res.send the result
}

我调用的 REST API 路由是一个 POST 请求,它将接收一个带有票证信息的 JSON 正文。然后它将返回一个包含票证信息和票证链接的 JSON 响应。

本质上,我只想传递 req.body 作为 API 调用的主体,然后 res.send() 传递 API 调用的响应。我试图找出一些使用 fetch 或 requests 的方法,但只是感到困惑。

非常感谢您提供的任何帮助!

【问题讨论】:

  • 你想调用任何第三方库还是你自己的路由?
  • 我希望我的 API 的用户只调用我的路由,但是该路由所做的只是将主体从调用传递到另一个 API,然后返回该 API 的响应。我可以根据需要使用第三方库。

标签: node.js api express post


【解决方案1】:

如果你想调用第三方API,我建议使用axios。简单的做法是创建一个 options(config) 将其传递给 axios 对象。

npm i axios --save 

Axios 配置

  const options = {
    'method': 'POST',
    'url': 'https://URL',
    'headers': {
      'Content-Type': 'application/json'
    },
    data: {
       firstName: 'Fred',
       lastName: 'Flintstone'
    }
  };

  try {
    const result = await axios(options);
    console.log(result);
  } catch (e) {
       console.log(e);
  }
  

在您的路线文件中:

const axios = require('axios');


const getData = async (body) => {
      const options = {
    'method': 'POST',
    'url': 'https://URL',
    'headers': {
      'Content-Type': 'application/json'
    },
    data: {
      body
    }
  };

  try {
    const result = await axios(options);
    console.log(result);
    return result;
  } catch (e) {
       console.log(e);
  }
}

router.post('/CreateTicket', cors(corsOptions), async function(req, res, next) {
   //make a call to another rest api and then res.send the result
  try {
    const response = await getData(req.body);
   res.send(response);
  } catch (e) {
    //wrap your error object and send it
  }
   
}

注意:如果你想将数据传递给你自己创建的路由,你可以使用res.redirect,它会发回响应。您可以在上面的链接中查看axios 的详细信息。

【讨论】:

  • 这很有帮助。太感谢了!一个简单的问题:配置会去哪里?在与路线相同的文件中?
  • 是的,或者您可以在不同的文件中创建一个辅助函数以重复使用它。它将根据您的使用情况而定。如果你只想在一个地方使用,你可以把它放在同一个文件中。
  • 最后一个快速问题:“const response = await getData(req.body)”行似乎会导致错误,因为 router.post 不是异步函数。但是,由于 get Data 是一个异步函数,我们应该如何等待响应?
  • 调用异步函数,不会产生任何错误。
【解决方案2】:

您必须使用 axios 或 http 之类的东西(代码来自链接):

const https = require('https')
const options = {
  hostname: 'example.com',
  port: 443,
  path: '/todos',
  method: 'GET'
}

const req = https.request(options, res => {
  console.log(`statusCode: ${res.statusCode}`)

  res.on('data', d => {
    return d
  })
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-09-04
    • 1970-01-01
    • 1970-01-01
    • 2020-11-13
    • 2016-07-22
    相关资源
    最近更新 更多