2017-01-23 17 views
1

Я моделирую слой auth для простого приложения action/redux. На стороне сервера у меня есть API, основанный на камне devise_token_auth.извлечение как JSON, так и заголовков из fetch()

Я использую fetch размещать знак в запросе:

const JSON_HEADERS = new Headers({ 
    'Content-Type': 'application/json' 
}); 

export const postLogin = ({ email, password }) => fetch(
    `${API_ROOT}/v1/auth/sign_in`, { 
    method: 'POST', 
    headers: JSON_HEADERS, 
    body: JSON.stringify({ email, password }) 
}); 

// postLogin({ email: '[email protected]', password: 'whatever' }); 

Это работает, и я получаю ответ 200 и все данные мне нужно. Моя проблема заключается в том, что информация делится между телом ответа и заголовками.

  • Body: Информация о пользователе
  • Заголовки: доступ-маркер, истечение срока действия и т.д.

Я мог разобрать телу JSON таким образом:

postLogin({ '[email protected]', password: 'whatever' }) 
    .then(res => res.json()) 
    .then(resJson => dispatch(myAction(resJson)) 

Но тогда myAction не будет получить любые данные из заголовков (потерянных при разборе JSON).

Есть ли способ получить оба заголовка и корпус от fetch Запрос? Спасибо!

ответ

1

Я думал, что я разделю, как мы, наконец, решить эту проблему: просто добавив шаг в .then цепи (до разбора JSON) для синтаксического анализа заголовков AUTH и направить соответствующие действия:

fetch('/some/url') 
    .then(res => { 
    const authHeaders = ['access-token', 'client', 'uid'] 
     .reduce((result, key) => { 
     let val = res.headers.get(key); 
     if (val) { 
      result[key] = val; 
     } 
     }, {}); 
    store.dispatch(doSomethingWith(authHeaders)); // or localStorage 
    return res; 
    }) 
    .then(res => res.json()) 
    .then(jsonResponse => doSomethingElseWith(jsonResponse)) 

еще один подход, вдохновленный могущественным Dan Абрамовым (http://stackoverflow.com/a/37099629/1463770)

fetch('/some/url') 
    .then(res => res.json().then(json => ({ 
    headers: res.headers, 
    status: res.status, 
    json 
    })) 
.then({ headers, status, json } => goCrazyWith(headers, status, json)); 

HTH

0

Может быть так:

postLogin({ '[email protected]', password: 'whatever' }) 
    .then(res => { 
    processHeader(res.headers.raw()) 
    dispatch(myAction(res.json())) 
    }) 
+0

Привет, спасибо за ваш ответ. К сожалению, 'myAction' должен будет принять обещание в качестве аргумента, поскольку res.json() возвращает его. Мы хотим передать простые данные создателям не-thunk action. – nerfologist

 Смежные вопросы

  • Нет связанных вопросов^_^