No tienes acceso a esta clase

¡Continúa aprendiendo! Únete y comienza a potenciar tu carrera

Aprende Inglés, Desarrollo Web, AI, Ciberseguridad y mucho más.

Antes: $249

Currency
$209
Comienza ahora

Termina en:

1 Días
12 Hrs
0 Min
18 Seg

Autenticación: registro

8/29
Recursos

Aportes 23

Preguntas 15

Ordenar por:

¿Quieres ver más aportes, preguntas y respuestas de la comunidad?

Para los que tiene el siguiente error:
nanoid es not a function

const { nanoid } = require('nanoid')

Vengo del mundo de Java y estoy acostumbrado a la creación de clases que servirán como payloads de request y response en cada petición. Además de crear clases que simulan el modelo de la base de datos. ¿En NodeJS no se realiza esto? Veo que se crean objetos dentro de las funciones pero no creamos prototipos ni clases en ningún componente. Quizás la creación de estas clases ayudarían a tener un código más mantenible y robusto. ¿Qué opinan?

¡Hola! Vengo del futuro. Si instalaste Nanoid 4.0.0 o arriba (puedes verificar fácilmente en package.json), las soluciones de nanoid is not a function no te van a ayudar porque para llamar Nanoid hay que usar import(), pero Nanoid funciona diferente ahí y volverás a ver el mismo error en el servidor.

Mi solución a esto fue bajar la versión de Nanoid usando

npm i -S nanoid@^3.0.0

y llamarlo con const { nanoid } = require('nanoid') como viene en otros comentarios.

Les recomiendo la extensión Thunderbolt de VS Code que prácticamente reemplaza a Postman y/o Insomnia para hacer esos métodos HTTP. Aquí dejo un vídeo de Youtube sobre ella

Otra solución para
nanoid es not a function

Definición de nano:
const nanoid = require(‘nanoid’);

Uso correcto:
nanoid.funcion();

Ejemplo:
nanoid.nanoid();

{
“error”: false,
“status”: 500,
“body”: “auth.upsert is not a function”
}

me sale error 500: “body”: “collection is not defined” no se donde es

No se recomienda guardar las contraseñas con los usuarios. Deben estar en diferentes entidades.

no me funciono nanoid. por lo tanto tuve que hacer algo rápido para seguir con el curso.

//const nanoid = require('nanoid');
const auth =  require('../auth');
const TABLA =  'user';

module.exports =  function (injecterStore) { 
    let store = injecterStore;
    if (!store) store = require('../../../store/dummy');

    function list() { 
        return store.list(TABLA);
    }

    function get (id) { 
        return store.get(TABLA, id);
    }

    async function upsert(body) {

        const user = {
            name: body.name,
            username: body.username
        }
        user.id = body.id ? body.id : Math.floor((Math.random() * 10000) ); //nanoid(10)

        if ( body.username || body.password ) {
            await auth.upsert({
                id: user.id,
                username: user.username,
                password: body.password
            })
        }
        
        return store.upsert(TABLA, user);
    }
     
    return {
        list,
        get,
        upsert
    }
 }```

/user/controller.js

    async function upsert(body) {
        const user = {
            name: body.name,
            username: body.username,
        }
        if (body.id) {
            user.id = body.id
        } else {
            user.id = nanoid()
        }
        // checking if password exist
        if (body.password || body.username) {
            await auth.upsert({
                id: user.id,
                username: user.username,
                password: body.password,
            })
        }

        return store.upsert(TABLA, user);
    }```
Pueden usar crypto.randomUUID(), No instalan nada.
Veo muchos comentarios sobre problemas de nanoid. Propongo usar uuid o simplemenete: `String(Math.floor(Math.random() * (100 - 0 + 1) + 0))`
En lugar de verificar si nos vino cada uno de los atributos con la validación, podemos crear un middleware donde verifiquemos que el body de la petición traiga esos campos. Y si no, mandar un error al usuario con code 403, mala petición

Pues genial todo xD

{
	"error": false,
	"status": 500,
	"body": "nanoid is not a function"
}

La parte de auth, se podria reducir un poco mas, utilizando las ventajas de EcmaScript con el SPREAD Operator

      await auth.upsert({ password, ...user });

/auth/controller.js

const TABLA = 'auth';

// auth entity
module.exports = function(injectedStore) {
    // validating if store exist
    let store = injectedStore;
    if (!store) {
        store = require('../../../store/dummy');
    }

    function upsert(data) {
        // make sure id is coming
        const authData = {
            id: data.id,
        }
        // spliting to create only data we need
        if (data.username) {
            authData.username = data.username;
        }

        if (data.password) {
            authData.password = data.password;
        }
        return store.upsert(TABLA, authData);
    }

    return {
        upsert,
    }
};```

Excelente gracias


Hola, estoy con este error. en la terminal no me imprime nada relevante. Estaré armando mal el json?

Muchas gracias!

Buen dia companeros, solo por curiosidad. al hacer el “post” en insomnia
"http://localhost:3000/api/user " En esta parte del codigo:

async function upsert(body) {
    const user = {
      name: body.username,
      username: body.username,
    };

    if (body.id) {
      user.id = body.id;
    } else {
      user.id = nanoid();
    }
    if (body.password || body.username) {
      await auth.upsert({
        id: user.id,
        username: body.username,
        password: body.password,
      });
    }

    return store.upsert(TABLE, user);
  }

Especificamente en este if:

if (body.password || body.username) {
      await auth.upsert({
        id: user.id,
        username: body.username,
        password: body.password,
      });
    }

El username tambien lo podemos requerir de body.username

Por que mandamos la contraseña en el body de la request?no creo que esta sea la forma mas segura de hacerlo

Otra recomendación podría ser encriptar la password, así aunque alguien logrará acceder a los datos no podría saber la contraseña. Una librería que nos permite hacerlo y que también nos permite validar fácilmente (por ejemplo en el login) es bcrypt: https://www.npmjs.com/package/bcrypt

Esta si audio desde el 9:30