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

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

在使用 Node.js 时,有许多库可以支持向其他服务器发起请求,比如 node-fetchphingot 或者 request(已弃用)等...

然而,如果你的服务器仅仅是作为客户端应用的 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)
        // Now you can use json data...
      } catch (err) {
        console.error(`Failed to parse JSON data - ${err.toString()}`)
      }
    })
  })
  .on('error', (err) => {
    console.error(`Failed to make request! 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 事件。

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

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)
// 使用获取到的数据...

Good luck!