我的个人博客

如何在 Node.js 中不安装外部库发起 HTTP 请求

Houses near valley with trees
Published on
/3 mins read/---

在使用 Node.js 时,有许多支持向另一个服务器发起请求的库,如 node-fetchphingotrequest(已弃用)...

然而,如果你的服务器只是作为客户端应用的 API,而你现在需要从另一个服务器请求一个 JSON 文件或者只是获取外部 API,你应该选择使用哪个库呢?

答案是你不需要为了创建请求而在 package.json 中添加新的依赖,因为 Node.js 有一个名为 https 的内置模块。

HTTPS

https 是 Node.js 预构建的轻量级模块,在大多数 Node.js 版本中都受支持。

你可以使用 https 创建请求,如下所示:

server.ts
let https = require('https')
 
https
  .get(url, (res) => {
    let body = ''
    res.on('data', (chunk) => (body += chunk))
    res.on('end', () => {
      try {
        let json = JSON.parse(body)
        // 现在你可以使用 json 数据...
      } catch (err) {
        console.error(`解析 JSON 数据失败 - ${err.toString()}`)
      }
    })
  })
  .on('error', (err) => {
    console.error(`请求失败!错误:${err.toString()}`)
  })

在上面的代码中:

  • https 是 Node.js 中的内置模块,所以你可以直接 require 它,无需安装。
  • 你可以使用 https.get(url[, options][, callback]) 创建请求
  • 回调中,你使用 res.on() 监听响应事件。
  • 每次触发 res.on("data") 时,你将 data 添加到字符串 body 中。
  • 当触发 res.on("end") 时,你可以简单地使用 JSON.parse(body) 将 body 解析为 JSON 对象。
  • 811 行:注意,你应该在 try {} catch() {} 块中解析数据,以捕获 JSON 无法解析时的错误。
  • 如果请求失败,将触发 error 事件。

就是这样!现在让我们将这个逻辑抽象成一个可以在服务器中任何地方使用的函数:

fetch-json.js
let https = require('https')
 
let fetchJSON = (url) => {
  return new Promise((resolve, reject) => {
    https
      .get(url, (res) => {
        let body = ''
        res.on('data', (chunk) => (body += chunk))
        res.on('end', () => {
          try {
            resolve(JSON.parse(body))
          } catch (err) {
            reject(err)
          }
        })
      })
      .on('error', reject)
  })
}
 
module.exports = fetchJSON

你可以这样使用它:

index.js
// 异步上下文
let data = await fetchJSON(url)
 
// 使用数据...

祝你好运!