0

モデルのユーザーでこの関数を呼び出そうとしています(マングースを使用しています)。このような:

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 throw e; // process.nextTick エラー、または最初のティックでの 'error' イベント ^ TypeError: undefined は関数ではありません

私は何を間違えましたか?

ありがとう、

4

1 に答える 1

4

現在、 2 つの異なるcallback変数があります。

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

それらは同じ識別子を共有するため、2 番目は 1 番目を「シャドウ」し、無名関数内で 1 番目にアクセスできないようにします。

最初のものを使用するには、それらのいずれかの名前を変更する必要があります-おそらくexistsCallbackおよび/またはfindOneCallback.

undefinedとにかくそうであるように見えるので、2番目を完全に削除することもできます:

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

callbackまた、JavaScript が実際に要求または強制しない値が に渡されていると想定しています。

これは、呼び出す前に値をテストすることで解決できます。

if (callback) callback(...);

または、定義されていない場合は「no-op」関数に設定します。

callback = callback || function() { return true; };
//...
callback(...);
于 2012-05-02T18:57:38.813 に答える