TypeError: done не является функцией

1

Я использую passport.js для проверки подлинности и обработки сеансов в моем проекте.

Я использую электронную почту для аутентификации из паспорта, но когда завершение вызывается при проверке, я получаю, что сделанная ошибка не является функцией.

at Promise.<anonymous> (/Users/sultan/Desktop/too2/controllers/users.js:39:28)
at Promise.<anonymous> (/Users/sultan/Desktop/too2/node_modules/mongoose/lib/promise.js:120:8) 

Код

  // LOCAL LOGIN =============================================================
passport.use('local-login', new LocalStrategy({
    usernameField : 'email',
    passwordField : 'password'
    //passReqToCallback : true // allows us to pass in the req from our route (lets us check if a user is logged in or not)
},
function( email, password, done) {
    if (email)
        email = email.toString().toLowerCase();

    // asynchronous
    process.nextTick(function() {
        User.findOne({ email:  email }, function(err, user) {
            // if there are any errors, return the error
            if (err)
                return done(err);

            // if no user is found, return the message
            if (!user)
        //(/Users/sultan/Desktop/too2/controllers/users.js:39:28)
                return done(null, false, {message: 'No user found.'});

            if (!user.validPassword(password))
                return done(null, false, {message: 'Oops! Wrong Password'});

            // all is well, return user
            else
                return done(null, user);
        });
    });

}));

В чем причина этой ошибки и как ее решить?

Теги:
authentication
passport.js

3 ответа

0
Лучший ответ

это сработало для меня

passport.use('login', new LocalStrategy({
        // by default, local strategy uses username
        usernameField : 'email',
        passwordField : 'password',
        passReqToCallback : true
    },
    function(req, email, password, done) {
        if (email) email = email.toLowerCase();

        // asynchronous
        process.nextTick(function() {
            User.findOne({ 'email' :  email }, function(err, user) {
                // if there are any errors, return the error
                if (err)
                    return done(err);

                // if no user is found, return the message
                if (!user)
                    return done(null, false, req.flash('loginMessage', 'No user found.'));

                if (!user.validPassword(password))
                    return done(null, false, req.flash('loginMessage', 'Oops! Wrong password.'));

                // all is well, return user
                else
                    return done(null, user);
            });
        });

    }));
0

Это может произойти из-за того, что вы завершаете свой код в process.nextTick()

Если вы хотите иметь асинхронный вызов для проверки своего пользователя, вы можете использовать обещания вместо ответа @Damien Gold. Я не могу проверить его, но что-то вроде ниже может работать.

Если Users.findOne() не подходит, вы можете использовать отложенное обещание или обещание (дайте мне знать, что я могу настроить свой ответ с помощью примера кода)

let promise = require('bluebird'); // or any other promise library

passport.use('local-login', new LocalStrategy({
    usernameField : 'email',
    passwordField : 'password'
    //passReqToCallback : true // allows us to pass in the req from our route (lets us check if a user is logged in or not)
},
function( email, password, done) {
    if (email)
        email = email.toString().toLowerCase();

        // not sure which db driver you are using but most implement promises now

        Let defer = promise.defer();

        User.findOne({ email:  email }, function(err, user) {
            if (err) { return defer.reject(err); }

             return defer.resolve(user);
        });

        defer.promise
        .then(function(user) {
            // if no user is found, return the message
            if (!user)
                return done(null, false, {message: 'No user found.'});

            if (!user.validPassword(password))
                return done(null, false, {message: 'Oops! Wrong Password'});

            // all is well, return user
            else
                return done(null, user);
        }).catch(function(err) {
            // if there are any errors, return the error
            return done(err);
        });
    });
}));
  • 0
    обещание вопроса ...... тогда это не функция
  • 0
    Я отредактировал свой пост. Просто npm install любую библиотеку обещаний (bluebird, когда, ...) Из любопытства, что стоит за пользователем? Ты знаком с обещанием?
Показать ещё 3 комментария
0

В настоящее время я работаю над проектом node.js, который требует аутентификации пользователя. Ниже приведен код в файле passport.js. Это должно сработать для вас. В случае, если вы не хотите использовать connect-flash узел connect-flash узла, вы можете заменить req.flash на {message:...}.

 var bCrypt = require('bcrypt-nodejs');
 var db = require("../models");
 module.exports = function(passport) {
   var user = db.User;
   var User = user;
   var LocalStrategy = require('passport-local').Strategy;


   passport.serializeUser(function(user, done) {
     done(null, user.id);
   });


   // used to deserialize the user
   passport.deserializeUser(function(id, done) {
     User.findById(id).then(function(user) {
       if (user) {
         done(null, user.get());
       } else {
         done(user.errors, null);
       }
     });

   });


   passport.use('local-signup', new LocalStrategy(

     {
       usernameField: 'email',
       passwordField: 'password',
       passReqToCallback: true // allows us to pass back the entire request to the callback
     },

     function(req, email, password, done) {


       var generateHash = function(password) {
         return bCrypt.hashSync(password, bCrypt.genSaltSync(8), null);
       };

       User.findOne({
         where: {
           email: email
         }
       }).then(function(user) {

         if (user) {
           return done(null, false, req.flash('signupMessage', 'That email is already taken'));

         } else {
           var userPassword = generateHash(password);
           var data = {
             email: email,
             password: userPassword,
             firstname: req.body.firstname,
             lastname: req.body.lastname
           };


           User.create(data).then(function(newUser, created) {
             if (!newUser) {
               return done(null, false, req.flash('userExist', 'You are already registered. Please sign in!'));
             }

             if (newUser) {
               return done(null, newUser, req.flash('userCreated', 'You are now registered and logged in!'));
             }

           });
         }

       });

     }

   ));

   //LOCAL SIGNIN
   passport.use('local-signin', new LocalStrategy({
       // by default, local strategy uses username and password, we will override with email
       usernameField: 'email',
       passwordField: 'password',
       passReqToCallback: true // allows us to pass back the entire request to the callback
     },

     function(req, email, password, done) {

       var User = user;

       var isValidPassword = function(userpass, password) {
         return bCrypt.compareSync(password, userpass);
       }

       User.findOne({
         where: {
           email: email
         }
       }).then(function(user) {

         if (!user) {
           return done(null, false, req.flash('signinError', 'Email does not exist'));
         }

         if (!isValidPassword(user.password, password)) {

           return done(null, false, req.flash('passwordError', 'Incorrect password.'));
         }

         var userinfo = user.get();

         return done(null, userinfo);

       }).catch(function(err) {

         console.log("Error:", err);

         return done(null, false, req.flash('genError', 'Something went wrong with your Signin'));

       });

     }
   ));
 }
  • 0
    Ошибка типа: (промежуточное значение). Тогда это не функция
  • 0
    @ Султан Заид Я обновил свой ответ.
Показать ещё 3 комментария

Ещё вопросы

Сообщество Overcoder
Наверх
Меню