javascript - 异步 Redux 操作 : add auth token to fetch() request

标签 javascript firebase authentication asynchronous redux

我目前有一个异步 redux 操作(带中间件),它从我的后端获取数据。我正在添加 Firebase 身份验证,并希望在此请求中包含身份验证 token 。使用下面的函数 getAuthToken() 异步获取授权 token 。下面的代码不起作用,提示

Cannot read property 'resolve' of undefined

这个简单的任务,将一个异步的输出链接到另一个,但我是 JS 的新手。我怎样才能做到这一点?

// I'm sure returning from an async function like this is wrong.
function getAuthToken() {
  firebase
    .auth()
    .currentUser.getIdToken(/* forceRefresh */ true)
    .then(idToken => {
      return idToken;
    });
}

// Async redux action.
export function getData(userId) {
  return dispatch => {
    return fetch(`${BASE_URL}/data/${userId}`, {
      headers: { Authorization: getAuthToken().resolve() } // Can I even resolve like this?
    })
      .then(response => response.json())
      .then(json => dispatch(returnSurveys(json)));
  };
}

最佳答案

短期解决方案:先等待 token ,然后发送您的请求。

function getAuthToken() {
  return firebase
    .auth()
    .currentUser.getIdToken(/* forceRefresh */ true)
    .then(idToken => {
      return idToken;
    });
}

export function getData(userId) {
  return dispatch => {
    return getAuthToken().then(token => 
      fetch(`${BASE_URL}/data/${userId}`, {
        headers: { Authorization: token } // Can I even resolve like this?
      })
      .then(response => response.json())
      .then(json => dispatch(returnSurveys(json))));
  };
}

缺点:每次你想向后端询问某事时调用 getAuthToken 绝对是不好的做法。

所以你最好把 token 和其他数据一样放入 Redux。

然后您可以从外部传递 token :

export function getData(userId, token) { ....

或者,可能更好,在你的 thunk 中向商店请求 token (第二个参数 getStateredux-thunk 传递):

export function getData(userId) {
  return (dispatch, getState) => {
    return fetch(`${BASE_URL}/data/${userId}`, {
      headers: { Authorization: getState().path.to.token.in.your.store } 
    })

在一段时间内,它被认为是一种相当糟糕的方法,这就是它不广为人知的原因。但是有不同的points of view对我来说,你的情况非常适合。

关于javascript - 异步 Redux 操作 : add auth token to fetch() request,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59416526/

相关文章:

javascript - 滚动到页面顶部时如何隐藏按钮?

android - 在 Firebase 数据库 android 中管理同一节点的多个事件监听器

javascript - Firebase - 未捕获( promise )TypeError : Cannot read property

ios - 如何用来自 firebase 的数据(字符串)填充数组

java - 没有浏览器的谷歌驱动器登录api

python - 使用python登录站点并在浏览器中打开登录站点

authentication - Flutter:应用生命周期之间的导航问题

javascript - 代码可以在两个站点上运行,但不能在第三个站点上运行

javascript - 如何获取表格内容并将其作为多维数组放入变量中

javascript - 如何使用 jQuery 不只选择表中的特定元素?