Node.js TypeError: indefinido no es una función

Estoy tratando de llamar a esta función en mi modelo Usuario (estoy usando mangosta). como esto:

UserSchema.statics.exists = function exists(req,email, callback) {
    this.findOne({
        email : email
    }, function(err, user,callback) {
        if(err) {
            console.error(err);
            return callback(err);
        }
        if(!user) {
            // console.log("Not user");
            return callback(null, false);// produce error
        }
        if(!user.valid) {
            console.log("User invalid");
            var hostname = req.headers.host;
            // hostname = 'localhost:8080'
            //var pathname = url.parse(req.url).pathname; // pathname = '/MyApp'

            var base_url = 'http://' + hostname + '/activation?key=' + user.account_no;
            user.verifyEmail(base_url, user, function(err, result) {
                if(err) {
                    console.error(err);
                return  callback(err);
                } else {
                    //if(email sent)
                    if(result) {
                    return  callback("Please check your email to activate your account");
                    } else {
                    return  callback("Activation error please contact WOWITO support");
                    }
                }
            });
        }
        return callback(null, user);
    });
}

pero luego obtuve el siguiente error:

nodo.js:201 tiro e; // error de process.nextTick, o evento 'error' en el primer tick ^ TypeError: indefinido no es una función

¿Qué hice mal?

Gracias,

preguntado el 02 de mayo de 12 a las 19:05

normalmente uno vería esto si la devolución de llamada no fuera realmente una función. Parece que quien haya llamado a esta función ha pasado en parámetros incorrectos... -

1 Respuestas

Tienes 2 diferentes callback variables, actualmente:

UserSchema.statics.exists = function exists(req, email, callback) { // 1st
    this.findOne({
        email : email
    }, function(err, user, callback) { // 2nd
    // ...

Como comparten el mismo identificador, el segundo "sombreará" al primero, haciendo que el primero sea inaccesible dentro de la función anónima.

Para usar el primero, tendrá que cambiar el nombre de uno de ellos, tal vez, existsCallback y/o findOneCallback.

También puede eliminar por completo el segundo, ya que parece ser undefined de todos modos:

UserSchema.statics.exists = function exists(req, email, callback) {
    this.findOne({
        email : email
    }, function(err, user) {
    // ...

También está asumiendo que se está pasando un valor para callback, que JavaScript en realidad no requiere ni aplica.

Puede resolver esto probando un valor antes de llamar:

if (callback) callback(...);

O configúrelo en una función "no operativa" cuando no esté definida:

callback = callback || function() { return true; };
//...
callback(...);

contestado el 02 de mayo de 12 a las 20:05

No es la respuesta que estás buscando? Examinar otras preguntas etiquetadas or haz tu propia pregunta.