[JavaScript] - Hilo oficial

B

#30 la cosa es que angular parece ir perfecto. He cambiado las peticiones de angular de http a https y ya no da el fallo de pedir http desde https.

El problema es que en el API si hago petición a http responde bien, pero si la hago a https no hay respuesta.

He creado en el API el servidor https, pero no hay forma, no hay respuesta. Ahí es donde me pierdo.

Ya no sé si es el API (que es un crud sencillo) o del servidor nginx que redirige todo a https o yo que sé 🤦‍♂️

1 respuesta
bultack

Aquí también podemos hablar sobre WebPack?

MisKo

#31 Con lo que ví en el hilo de fedadev, no he visto que usaras nginx en ningún momento, ya que tanto los certs como los puertos (80,443) los tenias puestos en node.

Pon la configuración de nginx y lo vemos, pero sigo pensando que tienes que hacer lo que te dije en el otro día

Node: Puerto 80 => 3000 ( por decir alguno )
Node: Puerto 443 => 3001 ( por decir alguno )

Nginx: Puerto 80:3000
Nginx: Puerto 443:3001

1 respuesta
B

Vale ya lo he solucionado. Gracias.

Ahora me pasa algo curioso, y es que desde el pc entra bien, pero desde el móvil parece no realizar la petición o no le devuelve nada.

sin https en el servidor ni en el api funcionaba sin problema. Es como que no realiza conexión con el api porque no me devuelve ni el fallo.

1 respuesta
Saphyel

#34 puedes decir como lo has solucionado? puede ser cache en el movil?

1 1 respuesta
B

#35 tenía creado solo un servidor node https y no ambos (http y https). Aunque juraría que eso da igual.
He cambiado el puerto a 3000 (https) y 3001 (http) y actualizado los certificados de node, ya que el puerto 443 parecía estar ocupado por la aplicación angular en nginx en https.

Con postman en post no me devolvía nada, he intentado hacer get en lugar de post en el navegador en el puerto 3000 y veía que devolvía algo, por lo que debía ser cosa de postman. (No entiendo por qué el post desde angular sí funciona y desde postman no).

He relacionado la consulta https de angular al puerto 3000 y efectivamente está comunicando, sin problema de CORS ni de https ni nada similar.

No he tocado nada de puertos en nginx.

Y ya me funciona desde IE y Android (ya que solo me funcionaba en Chrome de Windows) y era debido a los certificados de node y la IP de petición de angular, al no coincidir el certificado con el dominio (ya que ponía IP) algunos navegadores bloqueaban la consulta por seguridad de no coincidencia.

Todo solucionado al fin.

1
bultack

Alguno ha usado babel para alguna aplicación hecha con node?

He estado mirando para poder usar import/export y no tener que usar require y he visto en el resultado del transpiling que acaba haciendo un require de la librería.

Si en mi código hago un import { json, urlencoded } from 'body-parser' en el archivo resultado lo que hace es var _bodyParser = require("body-parser");

Por lo tanto, qué sentido tiene usar import si después hace un require la librería?

1 respuesta
Wasd

Jest (de facebook) se pasa a TypeScript, dejando Flow (de facebook, competidor de TypeScript).

https://github.com/facebook/jest/pull/7554#issuecomment-454358729

Por mi parte llevo ya año y medio trabajando con Node.js en TypeScript (por cierto, ni Node ni TS se mencionan en #1 , creo que no estaría de mas) y con Serverless Framework para deployar en AWS.

En cuanto pueda me miraré Loopback 4 (han cambiado muchisimas cosas respecto a Loopback 3) y NestJS (ambos escritos en TypeScript, por cierto). Este ultimo está muy inspirado por Angular, cosa que me parece bastante interesante.

1 respuesta
bultack

#38 He estado mirando muy por encima Loopback y tiene muy buena pinta, yo estoy haciendo una API con Express por ser el más típico

HiGher

#37 Hace muchas versiones que Node soporta módulos y el resto de características de ES6. No te hace falta Babel.

2 respuestas
B

#40 yo de hecho para node+express lo hago en typescript y encantado.

B

Por qué si tengo un *ngif con un loader para que me muestre el loader desde el inicio del ngoninit hasta el final, donde ya he de tener la data cargada y después muestro el elemento html, me da la consola error porque el html trata de hacer un *ngfor cuando la data aún no está cargada?

Técnicamente no muestra el html hasta que hace todo el ngoninit, y eso parece funcionar, pero al cargar el html se ve que aún no está la data que recorre el *ngfor.

La web funciona correctamente, pero no quiero esos errores en consola.

1 respuesta
Elitest

#42 Inicializa la data que recorra el ngFor en el constructor. Por ejemplo si tienes:

export class TuComponente implements OnInit {
  entities: any[];

  constructor() {
    this.entities = [];
  }

  ngOnInit() {
    // Actualizar entidades
  }
}

EDIT:
Ahora que lo pienso ngFor si es null o undefined no entra. Por lo tanto tu problema será que intentas acceder a un hijo de un padre no definido. Y en el ngOnInit si le asignas valor directamente no da pete, pero si lo haces asíncronamente te dará un error tipo:

ERROR TypeError: Cannot read property 'entities' of undefined

Varias soluciones:

  • En el ngFor poner ? en cada elemento padre:
    <div *ngFor="let entity of padre?.entities"></div>
    
  • Crearte un modelo del tipo de dato que recorras e inicializarlo en el constructor de tu componente haciendo un new Entity()

    export class Padre {
      ...
    
      constructor(...) {
        ...
      }
    }
    
    export class TuComponente implements OnInit {
      padre: Padre;
    
      constructor() {
        this.padre = new Padre(...);
      }
    }
    
    • También valdría inicializar en el constructor de tu componente hasta el ultimo padre

      export class TuComponente implements OnInit {
        padre: any;
      
        constructor() {
          this.padre = {};
        }
      }
      
1 respuesta
B

#43 no había caído en lo del opcional '?'.

Así es, el error es que al cargar el html la data no ha recibido aún la request y da undefined para acto seguido recibirla y cargar correctamente.

Lo que voy a intentar es que el loading siga, la data se pare y espere hasta recibir la request, y entonces una vez recibida la request seguir cargando la data del ngoninit, quitar el loader y que cargue el view.

La cosa es que el ngoninit hace la request pero avanza código sin haber recibido la data del api (o eso entiendo) y por eso el loader desaparece y carga el view sin aún haber procesado el json que espero del api.

La función del loader precisamente es esa, que el código espere hasta haber recibido la request del servidor, sino es una inutilidad.

Creo que tengo que mirar el tema del async/await.

1 respuesta
_Rpv

Bienvenido a lo asíncrono.
Yo lo que hago es tener un boleano para saber si han cargado los datos o no. Y en la vista un if. Y así de paso pongo un círculo típico de "cargando"

Leos

#44 Te lo dije en el otro tema, tienes que usar el await para que espere a la respuesta de la api

2 respuestas
B

#46 sí, por eso. Estoy de domingo, hasta mañana no podré probar. Gracias tío.

B

#46 se puede hacer un async/await de una request a la que te suscribes?

Por ahora he probado lo que decía #44 de hacer un new Class; en al iniciar, así no es undefined.

bultack

#40 He probado en la versión LTS y en la Current y al hacer un import me da error de que no se reconoce {. Con un default export tampoco me funciona.

Hay que activar algún flag?

Edit: Ahora acabo de ver en la documentación que es mediante un flag

1