Loopback: Error: Callback was already called

Created on 27 May 2019  Â·  7Comments  Â·  Source: strongloop/loopback

Description/Steps to reproduce

Loopback3

Hello i have a async remotheMethod and returns a warning "Error: Callback was already called."
How can i resolve that?

````javascript
Usuarios.usuarios_sin_grupos = async function (options, filter, cb) {
const usuariosGrupos = getManager().createQueryBuilder(UsuariosGruposEntity, 'usuarios_grupos').select("id_usuario");
var rawSql = false;

    let manager = getManager()
        .createQueryBuilder(UsuariosEntity, 'usuarios')
        .where("usuarios.id NOT IN (" + usuariosGrupos.getSql() + ")");

    utilidades.orderSkipLimit(manager, filter);

    var resultado = await utilidades.obtenerDatos(rawSql, manager, filter);

    if (resultado instanceof Error) {
        cb(resultado);
    } else {
        cb(null, resultado);
    }
};`

````

My method await utilidades.obtenerDatos:

````javascript
obtenerDatos: async function (rawSql, manager, filter) {
if (rawSql) {
var datos = await manager.getRawMany();
if (datos instanceof Error) {
return datos;
} else {
if (filter.get === "datacount") {
let data = [];
data.push(datos)
data.push(datos.length)
return datos;
} else {
return datos;
}
}

    } else if (filter && filter.get && filter.get === "datacount") {
        var datos = await manager.getManyAndCount();
        return datos;
    } else if (filter && filter.get && filter.get === "count") {
        var datos = await manager.getCount();
        return datos;
    } else {
        var datos = await manager.getMany();
        return datos;
    }
}

````

There is an error? or how can i fix the warning?
Thanks!

Most helpful comment

@pookdeveloper you have to remove the callback from your code.

`Usuarios.usuarios_sin_grupos = async function (options, filter) {
const usuariosGrupos = getManager().createQueryBuilder(UsuariosGruposEntity, 'usuarios_grupos').select("id_usuario");
var rawSql = false;

    let manager = getManager()
        .createQueryBuilder(UsuariosEntity, 'usuarios')
        .where("usuarios.id NOT IN (" + usuariosGrupos.getSql() + ")");

    utilidades.orderSkipLimit(manager, filter);

    var resultado = await utilidades.obtenerDatos(rawSql, manager, filter);

    if (resultado instanceof Error) {
        throw resultado ;
    } else {
        return  resultado;
    }
};

`

Hope this helps. Since the async function always returns a promise you don't have to explicitly return a promise(ie NEW PART OF CODE). Also, your remote method is an async function so you don't have to use callback there. Hope this helps

All 7 comments

I think you don't have to use callback when using an async function

On Mon, May 27, 2019, 1:01 PM pookdeveloper notifications@github.com
wrote:

Description/Steps to reproduce

Loopback3

Hello i have a async remotheMethod and returns a warning "Error: Callback
was already called."
How can i resolve that?

Usuarios.usuarios_sin_grupos = async function (options, filter, cb) {
const usuariosGrupos = getManager().createQueryBuilder(UsuariosGruposEntity, 'usuarios_grupos').select("id_usuario");
var rawSql = false;

    let manager = getManager()
        .createQueryBuilder(UsuariosEntity, 'usuarios')
        .where("usuarios.id NOT IN (" + usuariosGrupos.getSql() + ")");

    utilidades.orderSkipLimit(manager, filter);

    var resultado = await utilidades.obtenerDatos(rawSql, manager, filter);

    if (resultado instanceof Error) {
        cb(resultado);
    } else {
        cb(null, resultado);
    }
};`

My method await utilidades.obtenerDatos:

obtenerDatos: async function (rawSql, manager, filter) {
if (rawSql) {
var datos = await manager.getRawMany();
if (datos instanceof Error) {
return datos;
} else {
if (filter.get === "datacount") {
let data = [];
data.push(datos)
data.push(datos.length)
return datos;
} else {
return datos;
}
}

    } else if (filter && filter.get && filter.get === "datacount") {
        var datos = await manager.getManyAndCount();
        return datos;
    } else if (filter && filter.get && filter.get === "count") {
        var datos = await manager.getCount();
        return datos;
    } else {
        var datos = await manager.getMany();
        return datos;
    }
}

There is an error? or how can i fix the warning?
Thanks!

—
You are receiving this because you are subscribed to this thread.
Reply to this email directly, view it on GitHub
https://github.com/strongloop/loopback/issues/4206?email_source=notifications&email_token=ACK5UG5SQFMOFJ7NRE3DE3TPXOE5RA5CNFSM4HPZKDT2YY3PNVWWK3TUL52HS4DFUVEXG43VMWVGG33NNVSW45C7NFSM4GV6XQSQ,
or mute the thread
https://github.com/notifications/unsubscribe-auth/ACK5UG3DXGHUETJVGDVQ273PXOE5RANCNFSM4HPZKDTQ
.

Thanks @sujeshthekkepatt can you put an example ?

@pookdeveloper What kind of example?

I try to update this part of code but dosen't work
````javascript

obtenerDatos: async function (rawSql, manager, filter) {

    var data;
    var error;

    if (rawSql) {
        var datos = await manager.getRawMany();
        if (datos instanceof Error) {
            error = datos;
        } else {
            if (filter.get === "datacount") {
                let data = [];
                data.push(datos)
                data.push(datos.length)
                data = datos;
            } else {
                data = datos;
            }
        }
    } else if (filter && filter.get && filter.get === "datacount") {
        var datos = await manager.getManyAndCount();
        if (datos instanceof Error) {
            error = datos;
        } else {
            data = datos;
        }
    } else if (filter && filter.get && filter.get === "count") {
        var datos = await manager.getCount();
        if (datos instanceof Error) {
            error = datos;
        } else {
            data = datos;
        }
    } else {
        var datos = await manager.getMany();
        if (datos instanceof Error) {
            error = datos;
        } else {
            data = datos;
        }
    }
    // NEW PART OD CODE
    return new Promise((resolve, reject) => {
        if (error) {
            reject(error);
        } else {
            resolve(data);
        }
    });

}

````

@pookdeveloper What kind of example?

And example for resolve my problem 😖
Thanks

@pookdeveloper you have to remove the callback from your code.

`Usuarios.usuarios_sin_grupos = async function (options, filter) {
const usuariosGrupos = getManager().createQueryBuilder(UsuariosGruposEntity, 'usuarios_grupos').select("id_usuario");
var rawSql = false;

    let manager = getManager()
        .createQueryBuilder(UsuariosEntity, 'usuarios')
        .where("usuarios.id NOT IN (" + usuariosGrupos.getSql() + ")");

    utilidades.orderSkipLimit(manager, filter);

    var resultado = await utilidades.obtenerDatos(rawSql, manager, filter);

    if (resultado instanceof Error) {
        throw resultado ;
    } else {
        return  resultado;
    }
};

`

Hope this helps. Since the async function always returns a promise you don't have to explicitly return a promise(ie NEW PART OF CODE). Also, your remote method is an async function so you don't have to use callback there. Hope this helps

Was this page helpful?
0 / 5 - 0 ratings

Related issues

crandmck picture crandmck  Â·  3Comments

Overdrivr picture Overdrivr  Â·  4Comments

bryannaegele picture bryannaegele  Â·  4Comments

JoeShi picture JoeShi  Â·  4Comments

ImanMh picture ImanMh  Â·  4Comments