Проблема с загрузкой строки в виде текстового файла

#javascript #reactjs #react-redux #httprequest

#javascript #reactjs #react-redux #httprequest

Вопрос:

Я пытаюсь загрузить данные, полученные из запроса GET, в виде файла .txt, но я продолжаю получать «undefined» в качестве содержимого загруженного файла. Мне нужна только часть данных ответа. Ниже приведен пример ответа, а также мое действие redux, reducer и моя функция экспорта My action:

 export const previewLodgements = (id) => (dispatch) => {
  const accessToken = JSON.parse(localStorage.getItem('greenpole_redux_state'));
  dispatch({ type: certificateConstant.PREVIEW_CERTIFICATE_PROGRESS });
  fetch(`${urlConstants.CERTIFICATE_BASE_URL}certificate/lodge/preview/${id}`, {
    method: 'GET',
    headers: {
      Authorization: `Bearer ${accessToken.auth.token}`,
    },
  })
    .then((res) => res.json())
    .then((query) => {
      if (query.status === '00') {
        dispatch({
          payload: query.data,
          type: certificateConstant.PREVIEW_CERTIFICATE_SUCCESS,
          message: 'Preview successful',
        });
      } else {
        dispatch({
          payload: query.data,
          type: certificateConstant.PREVIEW_CERTIFICATE_FAILURE,
          message: query.statusMessage,
        });
      }
    })
    .catch((error) => {
      dispatch({
        payload: null,
        type: certificateConstant.PREVIEW_CERTIFICATE_FAILURE,
        message: 'unable to preview lodgements',
      });
    });
};
 

мой редуктор:

 import { certificateConstant } from '../../lib/constants/certificateConstants';

const initialState = {
  loading: false,
  previewLodgement: '',
};

const certificateReducer = (state = initialState, action) => {
  switch (action.type) {
        case certificateConstant.PREVIEW_CERTIFICATE_PROGRESS:
      return {
        status: action.status,
        message: action.message,
        loading: true,
      };
    case certificateConstant.PREVIEW_CERTIFICATE_SUCCESS:
      return {
        ...state,
        previewLodgement: action.payload,
        status: action.status,
        message: action.message,
        loading: false,
      };
    case certificateConstant.PREVIEW_LODGEMENT_FAILURE:
      return {
        ...state,
        previewLodgement: action.payload,
        status: action.status,
        message: action.message,
        loading: false,
      };
    default:
      return state;
  }
};

export default certificateReducer;

 

моя функция загрузки:

  const previewLodgement = useSelector(
    (state) => state.certificateReducer.previewLodgement,
  );
  const handleExport = () => {
    let id = selectedLodgements[0];
    if (validateCheck()) {
      dispatch(previewLodgements(id));
      var a = document.createElement('a');
      var file = new Blob([previewLodgement], { type: 'text/plain' });
      a.href = URL.createObjectURL(file);
      a.download = 'lodgement.txt';
      document.body.appendChild(a);
      a.click();
    }
  };
 

ответ, полученный с сервера после вызова API:

 {
    "status": "00",
    "statusMessage": "",
    "data": "Title: Certificate Lodgement 1nControl Number: 847834783748738nDate Lodged: 2020-12-27 00:00:00.0nStatus: Not TreatednnCertificatesn==============nnCertificate Number: 1324354565656565nOld Certificate Number: nVolume Of Bonds: 400nIssue Date: 2020-09-30 00:00:00.0nHolder Name: Andrew EfurhievwenHolder Address: 12, SpringfieldnHolder Email: nizyvi@getnada.comnHolder Cscs Account Number: 7647637467463746nOld Holder Cscs Account Number: nHolder Arp Account Number: 2111389645nOld Holder Arp Account Number: nIssuing Company: Duff Beernchn: 123456789nclaimed: YesnnCertificate Number: 1324354565656565nOld Certificate Number: nVolume Of Bonds: 400nIssue Date: 2020-09-30 00:00:00.0nHolder Name: Andrew EfurhievwenHolder Address: 12, SpringfieldnHolder Email: nizyvi@getnada.comnHolder Cscs Account Number: 7647637467463746nOld Holder Cscs Account Number: nHolder Arp Account Number: 2111389645nOld Holder Arp Account Number: nIssuing Company: Africa Prudentialnchn: nclaimed: YesnnCertificate Number: 2324354565656565nOld Certificate Number: nVolume Of Bonds: 400nIssue Date: 2020-09-30 00:00:00.0nHolder Name: Lisa SimpsonnHolder Address: 12, SpringfieldnHolder Email: nizyvi@getnada.comnHolder Cscs Account Number: 7647637467463746nOld Holder Cscs Account Number: nHolder Arp Account Number: PeternOld Holder Arp Account Number: nIssuing Company: Duff Beernchn: nclaimed: Yesnn",
    "date": 1609925003880
}
 

Я пытаюсь загрузить только строку в «data» в виде текстового файла

Комментарии:

1. каков результат console.log (запроса)?

2. Ответ совпадает с ответом, полученным от сервера после вызова API. Я привел пример выше. Это последний блок кода

Ответ №1:

Вы передаете query.data свой редуктор в качестве полезной нагрузки, затем (на вашем редукторе) ваш action.payload становится:

 "Title: Certificate Lodgement 1nControl Number: 847834783748738nDate Lodged: 2020-12-27 00:00:00.0nStatus: Not TreatednnCertificatesn==============nnCertificate Number: 1324354565656565nOld Certificate Number: nVolume Of Bonds: 400nIssue Date: 2020-09-30 00:00:00.0nHolder Name: Andrew EfurhievwenHolder Address: 12, SpringfieldnHolder Email: nizyvi@getnada.comnHolder Cscs Account Number: 7647637467463746nOld Holder Cscs Account Number: nHolder Arp Account Number: 2111389645nOld Holder Arp Account Number: nIssuing Company: Duff Beernchn: 123456789nclaimed: YesnnCertificate Number: 1324354565656565nOld Certificate Number: nVolume Of Bonds: 400nIssue Date: 2020-09-30 00:00:00.0nHolder Name: Andrew EfurhievwenHolder Address: 12, SpringfieldnHolder Email: nizyvi@getnada.comnHolder Cscs Account Number: 7647637467463746nOld Holder Cscs Account Number: nHolder Arp Account Number: 2111389645nOld Holder Arp Account Number: nIssuing Company: Africa Prudentialnchn: nclaimed: YesnnCertificate Number: 2324354565656565nOld Certificate Number: nVolume Of Bonds: 400nIssue Date: 2020-09-30 00:00:00.0nHolder Name: Lisa SimpsonnHolder Address: 12, SpringfieldnHolder Email: nizyvi@getnada.comnHolder Cscs Account Number: 7647637467463746nOld Holder Cscs Account Number: nHolder Arp Account Number: PeternOld Holder Arp Account Number: nIssuing Company: Duff Beernchn: nclaimed: Yesnn"
 

action.status для вашего объекта action нет свойства (вот почему вы получаете undefined), только одно свойство называется payload со строкой в качестве значения.

В вашем редукторе попробуйте войти action.payload в систему, и вам станет все ясно.