TypeError: не удалось выполнить 'fetch' в 'Window': недопустимое значение
Я попытался использовать fetch для вызова из бэкэнд с помощью реакции без libs (например, Axios). Поэтому я создал эту функцию:
export function api(url, method, body, isHeaderContentType,isRequestHeaderAuthentication,header, succesHandler, errorHandler) {
const prefix = 'link';
console.log("url:",prefix+url);
const contentType = isHeaderContentType ? {
'Content-Type': 'application/json',
} : {};
const auth = isRequestHeaderAuthentication
? {
Authorization: 'Bearer ${AuthUtils.getTokenUser}',
}
: {};
fetch(prefix + url, {
method,
headers: {
...contentType,
...auth,
...header,
},
protocol:'http:',
body,
})
.then(response => {
response.json().then(json => {
if (response.ok) {
console.log("method", json);
if (succesHandler) {
succesHandler(json)
}
} else {
return Promise.reject(json)
}
})
})
.catch(err => {
console.log("error",'${url} ${err}');
if (errorHandler) {
errorHandler(err);
}
})
} и назовите его так
api(
'link',
"GET",
null,
true,
true,
null,
response => {
this.setState({profile:response.data})
},
err => {
console.log('error', err);
}
);
Я вызываю api() внутри этой функции:
getProfileUser = () =>{
if (!isUserAuthenticated()){
history.push('/signin')
}else {
api(
'link',
"GET",
null,
true,
true,
null,
response => {
this.setState({profile:response.data})
},
err => {
console.log('error', err);
}
);
}
};
это мой полный компонент:
export default class Profile extends Component {
constructor(props) {
super(props);
this.state = {
profile:[]
}
}
getProfileUser = () =>{
if (!isUserAuthenticated()){
someCode
}else {
api(
'link',
"GET",
null,
true,
true,
null,
response => {
this.setState({profile:response.data})
},
err => {
console.log('error', err);
}
);
}
};
componentDidMount() {
this.getProfileUser();
}
render(){
return(
<div>
hello
</div>
)
}
}
но когда я попытался запустить его, у меня появилась такая ошибка
TypeError: не удалось выполнить 'fetch' в 'Window': недопустимое значение
Кто-нибудь знает, что не так с моим кодом? Функция работает, когда я использую метод "POST", но не работает, когда я использую метод "GET"
Ответы
Ответ 1
Это также случилось со мной, когда я попытался добавить заголовок Authorization
к моим вызовам извлечения. В моем случае это было вызвано символом новой строки в строке заголовка, то есть Bearer:\nsomelong-token
. Переход к новой линии в пространство решал проблему.
Ответ 2
Я имел это, передавая строку с символом новой строки в объект заголовка, например:
const myString = 'this is a string \nand this is a new line';
headers: {
'Content-Type': 'application/json',
'Authorization': 'Bearer ${token}',
'subscriptionId': myString
}
Ответ 3
У меня возникла та же проблема, но при работе с Angular 7 я использовал службу перехватчика, например:
// headerservice.ts
public intercept() {
const token = Cookies.get('token');
this.Language = Cookies.get('language');
this.headers = new HttpHeaders(
{
Authorization: 'JWT ' + token,
'Accept-Language': this.Language
}
);
return this.headers;
}
//other file
this.headers = this.headersService.intercept();
Но он не работает с другим файлом, в котором я выполняю выборку, поэтому я удаляю службу и помещаю заголовки непосредственно в функцию, и она работает!
как это:
const token = Cookies.get('token');
const language = Cookies.get('language');
const headers = {
Authorization: 'JWT ' + token,
'Accept-Language': language
}
const fetchParams = { method: 'GET',
headers: (headers) };
fetch(url, fetchParams)
Ответ 4
Эта ошибка произошла и со мной, но при других обстоятельствах. Я хотел бы поделиться этим в случае, если кто-то еще имеет эту проблему.
Таким образом, я получил ошибку " TypeError: Не удалось выполнить" извлечение "для" Window ": Неверное значение " при попытке загрузить файл с HTTP POST без использования FormData. Для решения этой проблемы я использовал объект FormData, а также добавленные свойства и сам файл:
let formData = new FormData();
formData.append('name', fileName);
formData.append('data', file);
Затем я использовал fetch для отправки файла методом POST. Вот псевдокод:
const options = {method: 'POST', formData};
fetch('http://www.someURL.com/upload', options);