【问题标题】:Is there a way to upload a file to Node.js using React and Observables (rx.js)?有没有办法使用 React 和 Observables (rx.js) 将文件上传到 Node.js?
【发布时间】:2020-02-09 11:48:43
【问题描述】:

我有一个 MERN 堆栈网络应用程序,它大量使用 rx.js “Observables”。我一直在搜索使我的应用程序能够将图像文件上传(二进制文件)到 Node.js api 端点(端点在接收端使用 npm 模块“multer”)的文档、插件、npm 模块等。

我一直无法使用 MERN + Observables 堆栈找到支持此特定功能的教程、库或模块。 Google 仅返回 Angular 的示例。而且在 stackoverflow 上似乎没有此类相关问题。

我有一个复杂的表单,有些字段是必需的,有些是可选内容。一项必需的输入是用于上传的图像文件。我的目标/希望是使用一系列链式 Observable 将所有这些数据传送到服务器。

是否有类似于 axios 的使用 observables 的 react 插件/模块/库,或者我只是因为“一厢情愿”而感到内疚?我想知道这是否可能,是否有人可以将我指向教程、文章、示例、github 等,或者直接告诉我方法。

注意:我对实现一个特殊的一次性案例并使用像 axios 这样的库没有任何问题,甚至只是编写原始的 JS XHR 来完成它,只是认为它会很好、干净和同质还要使用可观察对象来完成这项任务......另外,我对可观察对象还很陌生,所以我可能会遗漏一些重要的东西,或者根本不知道这个库(rx.js)不支持这种功能。

任何帮助、建议或见解都会很有用!非常感谢文档/文章/教程的链接!提前致谢!

【问题讨论】:

  • 所以您想知道如何使用rxjs.ajax 模块发送文件?
  • 可以向我们展示一些您迄今为止尝试过的代码吗?
  • @OlesSavluk 显然我在放屁,是的,我正在尝试弄清楚如何使用 rxjs 执行 ajax 帖子。我在 stackoverflow 上发现了另一个问题,表明 Observables 本身并不支持 multipart/form-data,这正是我所需要的。看起来我必须构建一些自定义或后备并使用支持表单数据的 ajax 库。这是包含类似问题的链接以及我在 cmets 部分中需要的答案:stackoverflow.com/questions/43151306/…。谢谢,你的信息很棒!

标签: node.js reactjs rxjs


【解决方案1】:

您可以提供FormData 实例作为rxjs.ajax body 参数,浏览器会自动设置正确的Content-Type 标头。

查看示例代码:

const { ajax } = rxjs.ajax; // = require("rxjs/ajax")
const { fromEvent } = rxjs; // = require("rxjs")
const { mergeMap } = rxjs.operators; // = require("rxjs/operators")

const fileInput = document.getElementById("file");
const res$ = fromEvent(fileInput, "change").pipe(
  mergeMap(e => {
    const { files } = e.target; 

    const body = new FormData();
    body.append("some-field", "fome-field-value");
    body.append("file", files[0]);

    return ajax({
      url: 'https://httpbin.org/post',
      method: 'POST',
      body
    });
  })
);

const htmlSubscription = res$
  .subscribe(e => {
    const response = JSON.stringify(e.response, null, 2);
    document.getElementById('root').innerHTML = `
      <div>
        <span><b>POST</b> https://httpbin.org/post</span>
        <pre>${response}</pre>
      </div>`;
  });
<script src="https://unpkg.com/rxjs@6.5.3/bundles/rxjs.umd.min.js"></script>
<input type="file" id="file" />

<div id="root">select file and see what happens...</div>

也看看:

【讨论】:

  • 我将您的答案标记为正确答案,因为尽管我缺乏简洁的语言,但您不知何故准确地找出了我正在寻找的内容。您为我提供了缺少的链接“multipart/form-data”,并演示了如何通过可观察的方式编织这种请求!我想表达我真诚和谦卑的感谢,感谢,感谢您抽出时间和耐心去解决所有这些麻烦来回答我的问题!你摇滚!非常感谢!!!
猜你喜欢
  • 2013-05-24
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-08-21
  • 2019-07-17
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多