Реагирует на собственную сетевую ошибку в запросе POST при добавлении тела - PullRequest
0 голосов
/ 08 ноября 2019

это снова я.

Я учусь реагировать на нативный, сейчас я пытаюсь загрузить файл, API уже протестирован с помощью почтальона, и он работает, поэтому я написал этот код:

import * as DocumentPicker from 'expo-document-picker';

async login () {
    let response = await DocumentPicker.getDocumentAsync({type: '*/*'})

    const data = new FormData();
    data.append('file', response)

    // Fetch attempt ----------------------------------------
    fetch("http://192.168.0.3:8000/api/file", {
      method: "POST",
      headers:{  
        "Content-Type": "application/x-www-form-urlencoded",
      },
      body: data
    })
    .then(response => response.json())
    .then(response => {
      console.log("upload succes", response);
    })
    .catch(error => {
      console.log("upload error", error, JSON.stringify(error));
    });

    // Axios attempt ----------------------------------------
    axios.post('http://192.168.0.3:8000/api/file', data, { headers:{ "Content-Type": "application/x-www-form-urlencoded"} } )
    .then(res => {
      console.log("goddaamittt wooork", res)
    })
    .catch(error => {
      console.log("error", error, JSON.stringify(error))
    });
  }

Когда я удаляю тело и заголовки из этого запроса, он на самом деле возвращает то, что должен вернуть API, когда вы пытаетесь выполнить POST к нему без «файла», какое-то сообщение «{'fileName»: «Требуется файл»} "но добавляя его к этому, я получаю сетевую ошибку, ошибку, которую я получаю при использовании извлечения:

upload error [TypeError: Network request failed] {"line":24646,"column":31,"sourceURL":"http://127.0.0.1:19001/node_modules/expo/AppEntry.bundle?platform=android&dev=true&minify=false&hot=false"}

когда он достигает попытки axios, он говорит что-то вроде этого:

[Unhandled promise rejection: TypeError: Network request failed]

Я перепробовал все, что знал, мне нужна помощь!

ИДК, если это важно, но вот что возвращает DocumentPicker, когда я выбираю файл:

Object {
  "name": "FB_IMG_1573232116651.jpg",
  "size": 32482,
  "type": "success",
  "uri": "file:///data/user/0/host.exp.exponent/cache/ExperienceData/%2540anonymous%252Fjsonplaceholder-bcb4c1c6-b37d-4634-99a5-3410d9b8654e/DocumentPicker/db8d78dd-2587-40e4-aed9-656c36df29f4.jpg",
}

Это ошибка, которую яполучить, когда я удаляю тело из запроса axios

ошибка [Ошибка: запрос не выполнен с кодом состояния 400] {"config": {"transformRequest": {}, "transformResponse": {},"headers": {"Accept": "application / json, text / plain, / "}, "timeout": 0," xsrfCookieName ":" XSRF-ЗНАК " "xsrfHeaderName": "X-XSRF-ЗНАК", "maxContentLength": - 1, "метод": "пост", "URL":" http://192.168.0.3:8000/api/file"},"response":{"data":{"message":"File требуется "}," status ": 400," headers ": {" map ": {" cache-control ":" public, max-age = 0 "," x-robots-tag ":" noindex ", "x-debug-token-link": "http://192.168.0.3:8000/_profiler/54e68c","x-debug-token":"54e68c","link":" http://192.168.0.3:8000/api/docs.jsonld; rel = \ "http://www.w3.org/ns/hydra/core#apiDocumentation\"","content-type":"application/json","x-powered-by":"PHP/7.2.4","connection":"close","date":"Fri, 08 ноя. 2019 17:54: 12 GMT "," host ":" 192.168.0.3:8000"‹‹ ,"config":ndom"transformRequest":ndom‹,"transformResponse":ndom‹,"headers": enj"Accept":"application/json, text / plain, /"}," timeout ": 0," xsrfCookieName ":" XSRF-TOKEN "," xsrfHeaderName ":" X-XSRF-TOKEN "," maxContentLength ": - 1, "method": "post", "url": "http://192.168.0.3:8000/api/file"},"request":{"url":" http://192.168.0.3:8000/api/file","credentials":"omit","headers":{"map":{"accept":"application/json, text / plain, /"}}, "метод": "POST", "режим": NULL, "ссылающаяся": NULL, "_ Bodytext": ""}}, "линии": 178773, "колонна": 26, "sourceURL": "http://127.0.0.1:19001/node_modules/expo/AppEntry.bundle?platform=android&dev=true&minify=false&hot=false"}

Ответы [ 2 ]

0 голосов
/ 08 ноября 2019

Это было такое решение для дампа, мне потребовались часы, чтобы найти это:

Когда я получил файл из DocumentPicker, мне пришлось добавить тип файла, потому что DocumentPicker возвращает странный тип, называемый «success». , когда я изменил его на 'image / jpeg', это сработало: D это вообще не решение, потому что мне нужно будет найти способ узнать, какой тип файла представляет собой каждый файл, который выбирает пользователь, в любом случае, этот код работает c:

let response = await DocumentPicker.getDocumentAsync({type: 'image/jpeg'})
    response.type = 'image/jpeg' // <- lasdfkasdfaslfkfsdkdsaf

    const data = new FormData();
    data.append('file', response);

    axios.post('http://192.168.0.3:8000/api/file', data , {headers: { 'Content-type': 'application/x-www-form-urlencoded' }} )
    .then(res => {
      console.log("gooosh", res.data)
    })
    .catch(error => {
      console.log("error", error, JSON.stringify(error))
    });
0 голосов
/ 08 ноября 2019

Вы должны попытаться изменить тип содержимого на

fetch("http://192.168.0.3:8000/api/file", {
      method: "POST",
      headers:{  
        'Content-Type': 'multipart/form-data',
      },
      body: data
    })

, а для формы-url-urlencoded выборка не поддерживается. Вы должны подтолкнуть его самостоятельно. Вы можете увидеть этот ответ .

...