【问题标题】:Nodejs: download a file into string via http, using async await syntaxNodejs:使用异步等待语法通过http将文件下载到字符串中
【发布时间】:2021-05-14 12:13:01
【问题描述】:

nodejs中如何在不使用第三方库的情况下通过http将文件下载到内存中?

This answer 解决了类似的问题,但我不需要将文件写入磁盘。

【问题讨论】:

  • 什么类型的文件? stackoverflow.com/questions/19119040/…
  • 好吧,您可以使用任何执行 http 请求的库(例如 nodejs 中内置的 http.get())轻松下载文本文件。如果它不是文本文件,因此以某种方式编码,那么您必须能够正确解码它。我们需要了解有关您要下载的确切内容的更多详细信息,以帮助您。为了获得最佳答案,请向我们提供您尝试下载的文件的 URL,以便我们准确查看它是什么。另外,为什么没有第三方库?
  • @Mellet 纯文本
  • @jfriend00 有时对于 nodejs 包大小很重要,例如在 lambdas 中。这就是为什么像http 这样的内置模块更可取
  • 捆绑 AWS Lamba 将是一个正当的理由,尽管总是尝试自己推出自己的产品有其自身的危险,所以显然这是一种权衡。

标签: javascript node.js http async-await


【解决方案1】:

您可以使用内置的http.get(),并且在nodejs 中有一个示例http doc

http.get('http://nodejs.org/dist/index.json', (res) => {
  const { statusCode } = res;
  const contentType = res.headers['content-type'];

  let error;
  // Any 2xx status code signals a successful response but
  // here we're only checking for 200.
  if (statusCode !== 200) {
    error = new Error('Request Failed.\n' +
                      `Status Code: ${statusCode}`);
  } else if (!/^application\/json/.test(contentType)) {
    error = new Error('Invalid content-type.\n' +
                      `Expected application/json but received ${contentType}`);
  }
  if (error) {
    console.error(error.message);
    // Consume response data to free up memory
    res.resume();
    return;
  }

  res.setEncoding('utf8');
  let rawData = '';
  res.on('data', (chunk) => { rawData += chunk; });
  res.on('end', () => {
    try {
      const parsedData = JSON.parse(rawData);
      console.log(parsedData);
    } catch (e) {
      console.error(e.message);
    }
  });
}).on('error', (e) => {
  console.error(`Got error: ${e.message}`);
});

此示例假定 JSON 内容,但您可以更改 end 事件处理程序中的流程,将 rawData 视为文本并将对 json contentType 的检查更改为您期望的任何类型。


仅供参考,这是一些较低级别的代码,我通常不会使用。如果您真的不想使用第三方库,您可以将其封装在您自己的函数中(可能带有一个承诺),但大多数人为此目的使用更高级别的库,这只会使编码更简单。对于这样的请求,我通常使用 got(),并且有一个其他库的列表(全部基于 promise)here

【讨论】:

    猜你喜欢
    • 2013-08-15
    • 1970-01-01
    • 2022-01-14
    • 1970-01-01
    • 1970-01-01
    • 2015-12-21
    • 2020-07-11
    • 2023-03-21
    • 2020-03-31
    相关资源
    最近更新 更多