Возможное отклонение необработанного обещания (id: 0): ошибка отсутствует baseUrl

Я получаю эту ошибку каждый раз, когда нажимаю определенную кнопку в моем приложении, поддерживающем реакцию. Я предполагаю, что он должен что-то делать с вызовом Api или, может быть, он пытается вызвать URL-адреса с помощью localhost: 8081, что может быть неправильным, поскольку он должен указывать на сервер. Я не знаю, как точно определить проблему. Любая помощь приветствуется. Я также теперь уверен, что проблема связана с файлом, которым я поделился ниже.

Предупреждение приложения:

Возможное отклонение необработанного обещания (id: 0): ошибка отсутствует baseUrl

Это мой код RestClient:

import {Alert, AsyncStorage} from 'react-native'
import {resetRouteTo} from 'util/NavigationHelper'
import {store} from '../index.js'
import {dropdownAlert} from 'util/AlertManager'

const DEFAULT_ERROR = {error: {code: 500, message: 'No JSON message'}}

export default class RestClient {
  constructor (baseUrl = '', navigation, { headers = {}, devMode = false, simulatedDelay = 0 } = {}) {
    if (!baseUrl) throw new Error('missing baseUrl')
    this.navigation = navigation
    this.headers = {
      'Accept': 'application/json',
      'Content-Type': 'application/json'
    }
    Object.assign(this.headers, headers)
    this.baseUrl = baseUrl
    this.simulatedDelay = simulatedDelay
    this.devMode = devMode
  }

  _clearTokenAndGo () {
    AsyncStorage.removeItem('apiToken')
    Alert.alert(
      'Error',
      'Something went wrong and your account needs to be re-instantiated.',
      [
        {text: 'OK', onPress: () => resetRouteTo(this.navigation, 'OnboardingFirst')}
      ],
      { cancelable: false }
    )
  }

  _simulateDelay () {
    return new Promise(resolve => {
      setTimeout(() => {
        resolve()
      }, this.simulatedDelay)
    })
  }

  async _parseIfJson (response) {
    var contentType = response.headers.get('content-type')
    if (contentType && contentType.indexOf('application/json') !== -1) {
      return response.json()
    }
    return null
  }

  async _handleError (response) {
    const body = await this._parseIfJson(response)
    if (!body) {
      dropdownAlert('error', `Server Error ${response.status}`, 'Something went wrong on the server')
      return DEFAULT_ERROR
    }
    switch (response.status) {
      case 200: {
        break
      }
      case 401: {
        if (body.error === 'Unauthenticated.') {
          this._clearTokenAndGo()
        }
        break
      }
      case 400: {
        dropdownAlert('error', `Error ${body.error.code}`, body.error.message)
        break
      }
      default: {
        if (body.error) {
          dropdownAlert('error', `Error ${body.error.code}`, body.error.message)
        } else {
          dropdownAlert('error', 'Error', `An unknown error has occurred. Http status ${response.status}`)
        }
        break
      }
    }
    return body
  }

  _fullRoute (url) {
    return `${this.baseUrl}${url}`
  }

  async _fetch (route, method, body, isQuery = false) {
    if (!route) throw new Error('Route is undefined')
    if (!store.getState().netinfo.isConnected) {
      this.navigation.navigate('BlockScreen')
      return {success: false, error: {code: 1, message: 'No internet connection.'}}
    }
    var fullRoute = this._fullRoute(route)
    if (isQuery && body) {
      var qs = require('qs')
      const query = qs.stringify(body)
      fullRoute = `${fullRoute}?${query}`
      body = undefined
    }
    let opts = {
      method,
      headers: this.headers
    }
    if (body) {
      Object.assign(opts, { body: JSON.stringify(body) })
    }
    const fetchPromise = () => fetch(fullRoute, opts)
    if (this.devMode && this.simulatedDelay > 0) {
      // Simulate an n-second delay in every request
      return this._simulateDelay()
        .then(() => fetchPromise())
        .then(response => response.json())
    } else {
      let promise = await fetch(fullRoute, opts)
      console.info('Logging response =>')
      console.info(promise)
      return this._handleError(promise)
    }
  }

  GET (route, query) { return this._fetch(route, 'GET', query, true) }
  POST (route, body) { return this._fetch(route, 'POST', body) }
  PUT (route, body) { return this._fetch(route, 'PUT', body) }
  DELETE (route, query) { return this._fetch(route, 'DELETE', query, true) }
}

Другие файлы, использующие RestClient:

import RestClient from 'util/RestClientLib'
import qs from 'qs'
import { Linking, AsyncStorage } from 'react-native'
import Config from 'react-native-config'
var SHA256 = require('crypto-js/sha256')

export default class ApiClient extends RestClient {
  constructor (authToken, navigation) {
    console.info('constructing apiClient with base: ', Config.API_URL)
    super(Config.API_URL, navigation, {
      headers: {
        'Authorization': 'Bearer ' + authToken
      }
    })
  }

  _switchSchemeTo (url, scheme) {
    var split = url.split(':')
    split[0] = scheme
    return split.join(':')
  }

  _makeAppUrl (url) {
    const prefix = url.split('.')[0]
    const bank = prefix.substr(prefix.lastIndexOf('/') + 1, prefix.length)
    switch (bank) {
      case 'florijnbank':
        return this._switchSchemeTo(url, 'flrb')
      default:
        return url
    }
  }

  async _openUrl (url) {
    const openInApp = await AsyncStorage.getItem('openInApp')
    const appUrl = this._makeAppUrl(url)
    Linking.canOpenURL(appUrl).then(supported => {
      if (!supported || openInApp !== 'true') {
        Linking.canOpenURL(url).then(supported => {
          if (!supported) {
            console.info('Can\'t handle url: ' + url)
          } else {
            Linking.openURL(url)
          }
        }).catch(err => console.error('An error occurred', err))
      } else {
        Linking.openURL(appUrl)
      }
    }).catch(err => console.error('An error occurred', err))
  }

  async createToken (pin) {
    var hash = SHA256(pin).toString()
    const query = {pincode: hash}
    let response = await this.POST('/user', query)
    return response.api_token
  }

  async checkPin (pin) {
    const hash = SHA256(pin).toString()
    const query = {pincode: hash}
    return this.GET('/user/validate', query)
  }

  getAccounts () {
    return this.GET('/account')
  }

  getBalance (iban) {
    return this.GET(`/account/${iban}`)
  }

  async getPermissionBank (bank) {
    const query = {
      bank_id: bank
    }
    let response = await this.POST('/account', query)
    return this._openUrl(response.url)
  }

  postCredentialsAis (form) {
    return this.POST('/account/password', form)
  }

  async ais (iban) {
    let response = await this.GET(`/ais/${iban}`)
    if (response.url == null) {
      return true
    }
    this._openUrl(response.url)
    return false
  }

  getTransactionDetails (requestId) {
    return this.GET(`/request/${requestId}`)
  }

  getTransactions (iban) {
    return this.GET(`/account/${iban}/transaction`)
  }

  getContacts () {
    return this.GET('/contacts')
  }

  getSettings () {
    return this.GET('/startup')
  }

  deleteAccount (iban) {
    return this.DELETE(`/account/${iban}`)
  }

  /**
   * async submitTransfer - submits a transfer
   *
   * @param  {Object} options  object which holds the pin, iban, sso and query
   * @param  {Object} transfer hold the transfer information
   * @return {Boolean}          either opens a link or a boolean for success
   */
  submitTransfer (iban, credentials, transfer) {
    const url = `/account/${iban}/transaction?${qs.stringify(credentials)}`

    const body = {
      counter_iban: transfer.counterIban,
      counter_account_name: transfer.name,
      amount: transfer.amount,
      description: transfer.description,
      reference: transfer.reference
    }

    return this.POST(url, body)
  }

  qrConfirmTransfer (transactionId, iban, credentials) {
    const url = `/request/${transactionId}/confirm/${iban}?${qs.stringify(credentials)}`
    return this.POST(url)
  }

  directConfirmTransfer (transactionId, iban, form) {
    const url = `/account/${iban}/transaction/${transactionId}`
    return this.POST(url, form)
  }

  verificationRequired (iban, amount) {
    const query = {amount: amount}
    return this.GET(`/veriReq/${iban}`, query)
  }
};

Можете ли вы поделиться кодом, который вызывает этот класс RestClient? Ожидается ли обратный вызов Promise?

Ashvin777 27.11.2018 14:48
if (!baseUrl) throw new Error('missing baseUrl') довольно очевиден, не так ли?
str 27.11.2018 14:49

@ Ashvin777 Спасибо за ответ. Я включил в этот поток код, который вызывает класс RestClient выше.

Aly Dabbous 27.11.2018 19:48
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
В настоящее время производительность загрузки веб-сайта имеет решающее значение не только для удобства пользователей, но и для ранжирования в...
Безумие обратных вызовов в javascript [JS]
Безумие обратных вызовов в javascript [JS]
Здравствуйте! Юный падаван 🚀. Присоединяйся ко мне, чтобы разобраться в одной из самых запутанных концепций, когда вы начинаете изучать мир...
Система управления парковками с использованием HTML, CSS и JavaScript
Система управления парковками с использованием HTML, CSS и JavaScript
Веб-сайт по управлению парковками был создан с использованием HTML, CSS и JavaScript. Это простой сайт, ничего вычурного. Основная цель -...
JavaScript Вопросы с множественным выбором и ответы
JavaScript Вопросы с множественным выбором и ответы
Если вы ищете платформу, которая предоставляет вам бесплатный тест JavaScript MCQ (Multiple Choice Questions With Answers) для оценки ваших знаний,...
0
3
529
0

Другие вопросы по теме