2012-02-16 9 views
6

Me está costando escribir mi pregunta de forma concisa y clara, así que déjenme describir con qué estoy trabajando.Prácticas recomendadas de la aplicación web de Javascript

Estoy construyendo una aplicación web que:

  • tiene su propia API alojada en un subdominio (https://api.example.com)
  • ha la aplicación principal alojado en el TLD (https://www.example.com)
  • el TLD no tiene ningún acceso de base de datos, pero en su lugar interactúa con la API para trabajar con datos
  • el tld se autentica con la API a través de OAuth y almacena el token de acceso y acceso a la clave secreta en una sesión
    • cuando la sesión termina, el token de acceso ya no se utiliza, registrando así al usuario a cabo

tengo una ruta en el dominio de nivel superior (vamos a llamarlo /ajax para esta pregunta) que las llamadas javascript (GET, PUT, POST, O DELETE) para realizar solicitudes a la API. De esta forma, nadie tiene que ver nunca el token de acceso, el secreto de token de acceso, la clave del consumidor ni el secreto del consumidor.

La forma en que lo veo, el token de acceso y el token secreto de acceso son las únicas cosas que necesito almacenar en una sesión ya que puedo obtener todo lo demás usando la API, pero en lugar de hacer una llamada cada vez por cada Necesito información, creo que algunas cosas deberían persistir, como aspectos del perfil del usuario, preferencias de diseño, etc.

¿Cuál es la mejor manera de lograr esto? ¿Almacenamiento local? ¿Galletas? ¿Debo eliminar esto y simplemente almacenarlo en sesiones?

Y si tiene algo de tiempo, ¿qué otras mejores prácticas existen para construir sitios como este que no conozca?

Respuesta

1

Estás en el camino correcto, pero almacena tus datos en JavaScript principalmente. Y acoplarlo con almacenamiento local cuando sea adecuado.

Cuando construyo aplicaciones como la que está describiendo, generalmente me ocupo de configurar las representaciones de JavaScript de los datos que recibo a través de la API.

Una de estas representaciones podría verse a continuación. Tenga en cuenta que mi código de ejemplo a continuación hace un par de suposiciones.

  1. Se hace la suposición de que se tiene un objeto definido api que se encarga de llamadas a la API, e invoca una devolución de llamada en la terminación.
  2. que los datos devueltos por la API son JSON que simplemente se pueden asignar a una variable de JavaScript,
  3. Que el JSON devuelto es una lista de objetos, cada uno con un campo "id".
  4. Que tiene algún tipo de objeto de evento, generalmente construyo mis propios eventos personalizados que básicamente llevan objetos function como oyentes y cuando se disparan pasan por los oyentes e invocan las funciones con o sin una carga útil según la situación.

Datos ejemplo contenedor:

MYAPP.data.BaseContainer = function (api_url, loadedEvent) { 
    var self = { 

     // Array to store the data returned via the APIs 
     _data : [], 

     // The API URL used to fetch data 
     api_url : api_url, 

     // Boolean flag to signify whether the _data variable has been populated 
     is_loaded : false, 

     // The even to fire once _data has been populated 
     loadedEvent : loadedEvent, 

     /** 
     * Returns the state of the is_loaded variable 
     */ 
     loaded : function() { 
      return self.is_loaded; 
     }, 

     /** 
     * Takes an ID and returns any member of the _data array 
     * that has that ID. 
     * 
     * @param id : an String or integer representing the ID. 
     * @returns {Object} 
     */ 
     byId : function (id) { 
      var toReturn = null; 
      for (var i = 0, len = self._data.length; i < len; i++) { 
       if (self._data[i].id == id) { 
        toReturn = self._data[i]; 
        break; 
       } 
      } 

      return toReturn; 
     }, 

     /** 
     * Returns the entire _data array. 
     */ 
     all : function() { 
      return self._data; 
     }, 

     /** 
     * This simple callback just stores the json response in 
     * its entirety on the _data variable. 
     */ 
     callback : function(data) { 
      self._data = data; 
      self.is_loaded = true; 
      loadedEvent.fire(self._data); 
     }, 

     /** 
     * Calls the API, if no callback has been specified as a parameter 
     * self.callback is used. 
     */ 
     getFromAPI : function(callback) { 
      if (typeof callback === 'undefined') { 
       callback = self.callback; 
      } 

      api.get(self.api_url, callback); 
     } 
    }; 

    self.getFromAPI(); 

    return self; 
}; 

Con este plan ahora puedo crear contenedores de datos específicos de esta manera:

/** 
* Stores a list of "friends" gotten from the API. 
* This is basically an instance of the BaseContainer object defined above. 
*/ 
MYAPP.data.Friends = (function() { 
    var self = MYAPP.data.BaseContainer("API_URL_TO_FECTH_FRIENDS_LIST", FriendsLoadedEvent); 

    return { 
     byId : self.byId, 
     all : self.all, 
     loaded : self.loaded 
    }; 
}()); 

Tan pronto como se ejecuta este código, se hace una llamada a la API y el FriendsLoadedEvent se disparará cuando esté listo. Entonces, para decirlo sin rodeos, utilizo JavaScript para almacenar mis cosas por lo general. ¡Pero si quieres lanzar LocalStorage en la mezcla también es fácil!

Simplemente agregue código de almacenamiento local al objeto BaseContainer que primero detecta si el cliente realmente admite el almacenamiento local, y si es así espeja el campo _data en el almacenamiento local. Esto es útil para mantener los datos utilizados con frecuencia disponibles rápidamente entre sesiones. Utilice las herramientas de análisis JSON disponibles para convertir los datos de JSON a LocalStorage "texto" y viceversa.

Solo tenga en cuenta que no puede confiar en LocalStorage como estructura de datos primaria, no tiene garantía de que el cliente lo admita, e incluso cuando hace los límites superiores de la cantidad de datos que puede almacenar es diferente entre navegadores. A fin de utilizarlo para almacenar datos que:

  • desea acceder a muy a menudo,
  • que se siente debe ser sólo allí, inmediatamente tan pronto como el usuario se conecta,
  • y que no cambia con frecuencia lo suficiente como para garantizar refrescantes llamadas API constantemente.
0

¡Enhorabuena! Ya has respondido la mayoría de tu pregunta. Si desea conservar los datos del usuario, deberá usar algo como almacenamiento local o cookies. En su caso, el almacenamiento local es lo mejor. Con las cookies, cada solicitud de página envía a las cookies junto con el encabezado.

Lo mejor de la suerte con su aplicación.

+0

¿Por qué el voto hacia abajo? –

+0

No te voté, ni siquiera tengo esa función desbloqueada. Si tuviera que adivinar, alguien malinterpretó tu respuesta como sarcasmo. – Steve

Cuestiones relacionadas