Отправка события в промежуточном программном обеспечении - PullRequest
0 голосов
/ 22 апреля 2019

У меня есть два промежуточных ПО в моем приложении Reaction-Redux.

  1. Первый - это API-интерфейс, который отправляет запросы на сервер и анализирует ответ с него.
  2. Вторым является промежуточное программное обеспечение Auth, которое хранит JWT в локальном хранилище и проверяет, был ли ответ от сервера кодом 401, мы должны обновить наш JWT.

Во втором промежуточном программном обеспечении я пытаюсь вызвать store.dispatch. В redux devToolsExtension я вижу новое действие, но это действие не переходит к первому промежуточному программному обеспечению ..

код. Первое промежуточное ПО:

const apiMiddleware = store => next => action => {

    const {api, type, ...rest} = action;
    if (!api) {
        return next(action);
    }

    next({
        type: type + START,
        ...rest
    });

    const { url } = api;
    let params = getParamsForApiCall(api);
    let statusCode;

    // TODO timeout from settings
    timeout(5000, fetch(url, params).then(response => {
        statusCode = processResponse(response);
        return response.text();
    //
    })).then(text => {
        let nextType = processAnwer(text, statusCode);
        let typeResult = type + nextType;
        console.log('Type result action: ', typeResult);

        return next({type: typeResult, statusCode, responce: text, ...rest})
    //
    }).catch(error => {
        processError(error)
    })
};

Второй:

import {SUCCESS, UNAUTH} from "../../Constants";
import {USER, LOGIN, CHECK_JWT, REFRESH_TOKEN, LOGOUT, userRefreshToken, userLogout } from "../AC/User"
import { HTTP_CODE_UNAUTH }  from "../../Constants/http"

import { saveJWTToStore, clearJWTFormStore } from '../../Utils/jwt'

const authMiddleware = ({ dispatch }) => next => action => {
    const { type, statusCode, responce, ...rest } = action;

    next(action);

    switch (type) {
    case USER + REFRESH_TOKEN + UNAUTH:
    case USER + CHECK_JWT + UNAUTH:
        console.log('UNAUTH have to logout');
        dispatch(userLogout());
        break;
    // ---------
    case USER + CHECK_JWT + SUCCESS:
    case USER + LOGIN + SUCCESS:
        let obj = JSON.parse(responce);
        let token = obj['token'];
        action = Object.assign(action, {token: token});
        saveJWTToStore(token);
        break;
    // ---------
    case USER + LOGOUT:
        console.log('Remove JWT from localStore');
        clearJWTFormStore();
        break;
    // ---------
    default:
      let errAuth = statusCode === HTTP_CODE_UNAUTH;
      if (errAuth) {
        console.log(`Need to refresh JWT`);

        // !!! this dispatch does not word as well
        dispatch(userRefreshToken());
      }

    }
};

export default authMiddleware;

1 Ответ

0 голосов
/ 22 апреля 2019

Одно из правил написания промежуточного программного обеспечения - вы всегда должны возвращать результат next().Это сделано для того, чтобы промежуточное ПО возвращало другую версию хранилища и обеспечивало правильную работу цепочки промежуточного ПО.
Возвращаясь к приведенному выше примеру, во втором промежуточном ПО вы не возвращаете значение next (), следовательно, другое промежуточное ПО не 'Получите ваш обновленный магазин.Чтобы исправить это:

let result = next(action);
...
return result;

или просто:

...
return next(action);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...