2015-09-12 24 views
6

Ho un'app React Native che funziona perfettamente con il debugger di Chrome aperto. Una volta a disattivare, però, continuo a ricevere il seguente errore ogni volta che provo a effettuare chiamate Parse:Parse non riesce a trovare la variabile localStorage in React Native

React Native and Parse error

pila La chiamata riconduce al seguente codice tenta di accedere un utente in:

Parse.User.logIn(
    email, 
    password, 
    { 
    success: function(res) { 
     console.log('success'); 
    }, 
    error: function(error) { 
     console.log(error.code + ' ' + error.message); 
    } 
    } 
); 

Ho provato a rimuovere le istruzioni della console, nel caso in cui l'errore avesse a che fare con la console non disponibile, ma inutile. Ciò accade con altre chiamate Parse e ha sempre a che fare con la variabile localStorage mancante.

Grazie in anticipo per qualsiasi aiuto!

UPDATE:

Sembra che ci sia un problema simile con Firebase. https://groups.google.com/forum/#!topic/firebase-talk/Y_usPRhOIYA

Si dice che il problema ha a che fare con il non essere un polyfill per localStorage.

risposta

10

Le risposte sopra sono tecnicamente corrette, ma Parse ha fornito una soluzione che non richiede un polyfil o un downgrade. Ciò era dovuto alla mia perenne mancanza di lettura. Ho trovato questo sul Parse React docs:

As of version 1.6, the Parse JS SDK has a different build for React Native. If you're using Parse+React on React Native, you'll need to require the 'parse-react/react-native' package instead.

Ad esempio:

// For React Native apps 
var React = require('react-native'); 
var Parse = require('parse/react-native'); 
var ParseReact = require('parse-react/react-native'); 

Ci scusiamo per non menzionare usavo Parse React pure. Ho pensato che il problema fosse solo con Parse, poiché non avevo iniziato ad aggiungere sottoscrizioni dati tramite Parse React.

+1

Utilizzo di Parse v1.6.4 e React-Native v2.14.3. Quando provo il richiede come mostrato qui ottengo il seguente errore: 'Richiede modulo sconosciuto" parse-react/react-native ". Se sei sicuro che il modulo è lì, prova a riavviare il packager. Come per il poster originale, l'originale include: 'var Parse = require ('parse'). 'var ParseReact = require ('parse-react'); funziona ancora correttamente se sono in modalità di debug e nell'emulatore iOS, ma nell'emulatore Android e sui dispositivi reali che codificano si lamentano sempre di localStorage non trovato. –

2

Questo è corretto (con polyfill). Non è stato aggiunto localStorage come polyfill, né il motore javascriptCore di Apple ha implementato localStorage (dove è implementato ovviamente il v8 di Chrome). Il motivo principale è che localStorage è sincrono e React dovrebbe funzionare solo con operazioni asincrone di progettazione.

C'è una bella soluzione/mini-polyfill che sostituisce localstorage con una versione in memoria: https://gist.github.com/juliocesar/926500. Questo dovrebbe consentire a parse di usare localstorage per la cache (questo è lo scopo principale in cui lo stanno usando ora credo). I dati non verranno memorizzati in modo persistente tra le esecuzioni dell'applicazione. Non sono sicuro che tu possa disabilitare l'uso di spazio locale da Parse, ma questa è un'altra possibilità da esplorare.

2

Ho eseguito il downgrade a 1.5.0 e ora funziona.

"dependencies": { 
    "parse": "1.5.0", 
1

Non credo che nemmeno essere obbligati a utilizzare Parse + React sia una soluzione sufficiente. Per esempio sto costruendo la mia app con Redux, per me è molto più sensato mantenere tutte le mie richieste API all'interno dei miei creatori di azioni.

In 1.6.0 Parse ci costringe a utilizzare Local Storage, quando React Native non lo supporta. React Native supporta tuttavia AsyncStorage.

Per me ho appena eseguito il downgrade a 1,5, si spera che offriranno un'opzione per utilizzare Archiviazione locale o Archiviazione asincrona in futuro.

Così le persone che inciampano su questo e non vorrebbero essere costretti a usare Parse + Reagiscono sulla risposta è di effettuare il downgrade a 1.5, nel tuo package.json cambia le tue dipendenze su "parse": "1.5.0".