如何在快速路由器获取请求中从节点获取中使用获取

Posted

技术标签:

【中文标题】如何在快速路由器获取请求中从节点获取中使用获取【英文标题】:How to use fetch from node-fetch inside an express router get request 【发布时间】:2021-10-03 17:19:01 【问题描述】:

我正在使用 node-fetch 从快速路由器获取请求中的 github(用户存储库)获取外部资源,如下所示。

import fetch from 'node-fetch

router.get('/github/:username', async (req, res) => 
  try 
    const uri = `http://api.github.com/users/$req.params.username/repos?per_page=5&sort=created:asc&client_id=$process.env.GITHUB_CLIENT_ID&client_secret=$process.env.GITHUB_CLIENT_SECRET`;

    const response = await fetch(uri, 
      method: 'GET',
      mode: 'cors',
      headers:  'Content-Type': 'application/json' 
    );

    return res.json(response);
   catch (err) 
    console.error(err.message);
    res.status(500).send('server error');
  
);

但是当我到达这条路线时,我在邮递员中得到以下响应:


    "size": 0,
    "timeout": 0

有谁知道我做错了什么?

编辑:

如果我从 fetch 中获得 console.log(response),我会得到(从 gi​​thub 用户 rmosolgo 搜索 repos,例如:

Response 
  size: 0,
  timeout: 0,
  [Symbol(Body internals)]: 
    body: Gunzip 
      _writeState: [Uint32Array],
      _readableState: [ReadableState],
      _events: [Object: null prototype],
      _eventsCount: 5,
      _maxListeners: undefined,
      _writableState: [WritableState],
      allowHalfOpen: true,
      bytesWritten: 0,
      _handle: [Zlib],
      _outBuffer: <Buffer 5b 7b 22 69 64 22 3a 33 37 33 31 38 30 35 32 32 2c 22 6e 6f 64 65 5f 69 64 22 3a 22 4d 44 45 77 4f 6c 4a 6c 63 47 39 7a 61 58 52 76 63 6e 6b 7a 4e 7a ... 16334 more bytes>,
      _outOffset: 0,
      _chunkSize: 16384,
      _defaultFlushFlag: 2,
      _finishFlushFlag: 2,
      _defaultFullFlushFlag: 3,
      _info: undefined,
      _maxOutputLength: 4294967295,
      _level: -1,
      _strategy: 0,
      [Symbol(kCapture)]: false,
      [Symbol(kTransformState)]: [Object],
      [Symbol(kError)]: null
    ,
    disturbed: false,
    error: null
  ,
  [Symbol(Response internals)]: 
    url: 'https://api.github.com/users/rmosolgo/repos?per_page=5&sort=created:asc&client_id=Iv1.cafc8d8f7e1b91ac&client_secret=824bedd0eb406f92a3380d8043c273655cdc1f99',
    status: 200,
    statusText: 'OK',
    headers: Headers  [Symbol(map)]: [Object: null prototype] ,
    counter: 1
  


【问题讨论】:

为什么要将 OAuth 客户端详细信息传递给 REST API 端点? 您似乎发布了邮递员的回复,但不是您的取件。 【参考方案1】:

如果您想从响应中获取/提取 JSON,您需要对响应执行 async json()res.json 会自动为您执行此操作。这类似于浏览器中的fetch

const response = await fetch(uri, 
  method: 'GET',
  mode: 'cors',
  headers:  'Content-Type': 'application/json' 
).then(res => res.json());

return res.json(response);

或:

const response = await fetch(uri, 
  method: 'GET',
  mode: 'cors',
  headers:  'Content-Type': 'application/json' 
)

const data = await response.json();

return res.json(data);

希望对您有所帮助!

【讨论】:

以上是关于如何在快速路由器获取请求中从节点获取中使用获取的主要内容,如果未能解决你的问题,请参考以下文章

使用搜索参数快速路由 GET

NextJS getServerSideProps() 具有多个获取请求

如何使用 HERE 中的异步矩阵路由 API v8 来获取包括交通在内的行程时间响应

快速路由挂起异步等待

不使用 node-fetch 调用的快速路由

如何在Zend Framework 2中访问路由,发布,获取等参数