【问题标题】:Cannot POST a multipart/form-data using Fetch TYPESCRIPT无法使用 Fetch TYPESCRIPT POST 多部分/表单数据
【发布时间】:2020-03-20 21:49:36
【问题描述】:

我正在尝试在下面获取此代码,我开始使用 fetch 所以我遇到了一些问题

import fetch, { Headers, RequestInit } from "node-fetch";
import FormData = require("form-data");

const exampleFile = fs.createReadStream(path.join(__dirname, "../lib/dummy.pdf"));
  const myHeaders = new Headers();
  myHeaders.append("Content-Type", "multipart/form-data");

const form = new FormData();
  form.append("file", exampleFile);

const requestOptions: RequestInit = {
    method: "POST",
    headers: myHeaders,
    body: form,
    redirect: "follow"
  };

await fetch(`https://api.mercadolibre.com/messages/attachments?access_token=${accessToken}`, requestOptions)
    .then(response => response)
    .then(result => console.log(result))
    .catch(error => console.log("error", error));

但这会响应这个 JSON(它应该只是 MercadoLibre 附件的 Id):

Response {
  size: 0,
  timeout: 0,
  [Symbol(Body internals)]: {
    body: PassThrough {
      _readableState: [ReadableState],
      readable: true,
      _events: [Object: null prototype],
      _eventsCount: 2,
      _maxListeners: undefined,
      _writableState: [WritableState],
      writable: false,
      allowHalfOpen: true,
      _transformState: [Object],
      [Symbol(kCapture)]: false
    },
    disturbed: false,
    error: null
  },
  [Symbol(Response internals)]: {
    url: 'https://api.mercadolibre.com/messages/attachments?access_token=#######',
    status: 400,
    statusText: 'Bad Request',
    headers: Headers { [Symbol(map)]: [Object: null prototype] },
    counter: 0
  }
}

我的代码有什么问题?

【问题讨论】:

  • From .then(response => response) To .then(response => response.json()) 但是由于您的响应状态是 400,服务器也不期望您的请求格式。 (来源:developer.mozilla.org/en-US/docs/Web/API/Body/json
  • @MoK 是的,我的意思是,我想知道请求格式有什么问题。感谢 .json() 部分。

标签: typescript request fetch multipartform-data form-data


【解决方案1】:

更新:我能够通过排除 Content-Type 属性来修复它,允许 fetch 自动检测和设置边界和内容类型。

新代码:

const exampleFile = fs.createReadStream(path.join(__dirname, "../lib/dummy.pdf"));

const form = new FormData();
form.append("file", exampleFile);

const requestOptions: RequestInit = {
    method: "POST",
    body: form
  };

await fetch(`https://api.mercadolibre.com/messages/attachments?access_token=${accessToken}`, requestOptions)
    .then(response => response.json())
    .then(result => console.log(result))
    .catch(error => console.log("error", error));

【讨论】:

    猜你喜欢
    • 2019-08-21
    • 2016-05-13
    • 2014-03-29
    • 1970-01-01
    • 1970-01-01
    • 2019-06-01
    • 2015-07-07
    • 2017-07-02
    • 2021-12-12
    相关资源
    最近更新 更多