API提取

时间:2018-02-03 23:08:29

标签: javascript fetch

我在使用Spotify Web应用程序时遇到了一个奇怪的错误。我尝试将播放列表保存到我的帐户,该帐户必须从https://api.spotify.com/v1/me端点获取id元素,然后将播放列表应用到您的帐户。否则一切似乎都没问题,除了对端点的提取,这会引发错误:

Spotify.js:81 Uncaught (in promise) TypeError: Failed to execute 'fetch' on 'Window': The provided value is not of type '(sequence<sequence<ByteString>> or record<ByteString, ByteString>)'

我之前从未见过这个错误,也不确定为什么会这样。 findUserId方法是:

findUserId() {
  if(accessToken === undefined) {
    this.getAccessToken();
  }
  console.log(accessToken);
  let userId;
  fetch(`https://api.spotify.com/v1/me`, {headers: `Bearer ${accessToken}`}
    ).then(response => {return response.json()}
    ).then(jsonResponse => {
        userId = jsonResponse.id;
    });
  console.log(userId);
  return userId;
}

3 个答案:

答案 0 :(得分:1)

headers应该是一个对象 - 更改

{headers: `Bearer ${accessToken}`}

{headers: {'Authorization': `Bearer ${accessToken}`}}

答案 1 :(得分:1)

首先,您必须在Authentication内设置headers标头。此外,fetch是异步的,这意味着您尝试在网络请求完成之前记录userId。要解决此问题,请将您的日志放入第二个then回调中并返回fetch

findUserId() {
  if (accessToken === undefined) {
    this.getAccessToken();
  }

  console.log(accessToken);

  return fetch(`https://api.spotify.com/v1/me`, {
    headers: { Authentication: `Bearer ${accessToken}` }
  })
    .then(response => response.json())
    .then(jsonResponse => {
      userId = jsonResponse.id;
      console.log(userId);
      return userId;
    });
}

然后您可以像这样使用findUserId

async otherFunction() {
  const userId = await this.findUserId();
  console.log(userId);
}

或者像这样:

otherFunction() {
  this.findUserId().then(userId => console.log(userId));
}

答案 2 :(得分:0)

这不是你如何用fetch做标题。我认为你的意思是设置授权标头。见https://developer.mozilla.org/en-US/docs/Web/API/Fetch_API/Using_Fetch#Headers

编辑:错误的链接