【问题标题】:Node.js TypeError: undefined is not a functionNode.js TypeError:未定义不是函数
【发布时间】:2012-05-03 03:18:21
【问题描述】:

我正在尝试在我的模型用户上调用此函数(我正在使用猫鼬)。像这样:

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);
    });
}

但后来我收到以下错误:

node.js:201 扔 e; // process.nextTick 错误,或第一次滴答时的 'error' 事件 ^ TypeError: undefined is not a function

我做错了什么?

谢谢,

【问题讨论】:

  • 如果回调实际上不是一个函数,通常会看到这一点。似乎调用此函数的人传递了错误的参数...

标签: javascript node.js mongoose


【解决方案1】:

您目前有 2 个不同的 callback 变量:

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

由于它们共享相同的标识符,因此第二个将“遮蔽”第一个,从而使第一个在匿名函数中无法访问。

要使用第一个,您必须重命名其中一个——也许是existsCallback 和/或findOneCallback

您也可以直接删除第二个,因为无论如何它似乎是undefined

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

您还假设正在为 callback 传递一个值,而 JavaScript 实际上并不要求或强制执行该值。

您可以通过在调用之前测试一个值来解决此问题:

if (callback) callback(...);

或在未定义时将其设置为“无操作”功能:

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2012-10-23
    • 2016-01-14
    • 2015-08-04
    • 2014-10-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多