使用node-fetch时如何使请求体类型与RequestInit或BodyInit兼容?

时间:2017-05-16 09:14:05

标签: node.js typescript node-fetch

我开始为我的nodejs项目使用Typescript。为了访问某些外部API,我使用node-fetch来发出请求。在设置PUT请求时,会弹出一个错误,指出给定的主体不能分配给RequestInit类型:

错误:

Error:(176, 28) TS2345:Argument of type '{ headers: Headers; method: string; body: MyClass; }' is not assignable to parameter of type 'RequestInit'.
  Types of property 'body' are incompatible.
    Type 'MyClass' is not assignable to type 'BodyInit'.
      Type 'MyClass' is not assignable to type 'ReadableStream'.
        Property 'readable' is missing in type 'MyClass'.

MyClass的:

class MyClass {
  configId: string;
  adapterType: string;
  address: string;

  constructor(configId: string, adapterType: string, address: string) {
    this.configId = configId;
    this.adapterType = adapterType;
    this.address = address;
  }

  // some methods
}

调用:

let body = new MyClass("a", "b", "c")
let url = config.url + "/dialog/" + dialogId
let headers = new Headers()
// Append several headers

let params = {
  headers: headers,
  method: "PUT",
  body: body
}

return new Promise((resolve, reject) => {
  Fetch(url, params) // <-- error is shown for params variable
    .then(res => {
      // Do stuff
      resolve(/*somevalue*/)
    })
}

我应该如何使身体对象兼容?

3 个答案:

答案 0 :(得分:2)

我可以想到两种可能的方法 - 一种是以特定方式设置标头以补充body类型将解决它。

另一个想法是类的实例可能不是合适的体型。你能把它字符串化吗?

更新:我对RequestInit也有一个奇怪的错误,它通过指定选项的类型(你称之为'params')对象来解决,如下所示:

let params: RequestInit = {
  ...
}

答案 1 :(得分:0)

您需要对身体进行梳理:

let params: RequestInit = {
  headers: headers,
  method: "PUT",
  body: JSON.stringify(body)
}

答案 2 :(得分:0)

我不得不从 RequestInit 导入 node-fetch 而不是使用内置的打字稿。

这个:

import fetch, { RequestInit } from 'node-fetch'

let params: RequestInit = {
  headers: headers,
  method: "PUT",
  body: JSON.stringify(body)
}

不是

import fetch from 'node-fetch'

let params: RequestInit = {
  headers: headers,
  method: "PUT",
  body: JSON.stringify(body)
}