this._verify не является функцией при входе в систему - PullRequest
0 голосов
/ 11 июля 2020

Я пытаюсь создать приложение CRUD для своего портфолио. Я хочу, чтобы пользователь мог зарегистрироваться и войти в систему, а затем сделать некоторые вещи внутри (это трекер калорий). Пользователь может зарегистрироваться, но когда я пытаюсь войти, я получаю:

this.verify не является функцией

Вот код входа:

// Authenticate Login
app.post("/login", (req, res, next) => {
    passport.authenticate("local", {
        successRedirect: "/myprofile",
        failureRedirect: "/login",
        failureFlash: true
    })(req, res, next);
});

Паспорт. js

const LocalStrategy = require("passport-local").Strategy,
      bcrypt = require("bcryptjs");

// User Model
const User = require("../models/user");

module.exports = function(passport) {
    passport.use(
        new LocalStrategy({usernameField:"username"}, {passReqToCallback: true}, (username, password, done) => {
            // Check if there is a user with this username
            User.findOne({
                username: username
            }).then(user => {
                    if(!user) {
                        return done(null, false, {message: "There is not a user with this username"});
                    }
                    // Check if the password is correct
                    bcrypt.compare(password, user.password, (err, isMatch) => {
                        if(err) throw err

                        if(isMatch) {
                            return done(null, user)
                        } else {
                            return done(null, false, {message: "Password is invalid"})
                        }
                    });
                })
                .catch(err => console.log(err));
        })
    );

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

    passport.deserializeUser((id, done) => {
        User.findById(id, (err, user) => {
            done(err, user)
        })
    })
}

Если кому-то интересно или вам нужен еще код, я, конечно, могу опубликовать его, я не уверен, что еще включить. Но если вам это нравится, вот ссылка на GitHub Repo .

Спасибо за вашу помощь, оставайтесь здоровыми

Edit1: Fullstack of вопрос (или надеюсь это он)

TypeError: this._verify is not a function
    at Strategy.authenticate (C:\Users\Dell Vostro 3885\Documents\Programming\PersonalProjects\CalorieTracker\node_modules\passport-local\lib\strategy.js:90:12)
    at attempt (C:\Users\Dell Vostro 3885\Documents\Programming\PersonalProjects\CalorieTracker\node_modules\passport\lib\middleware\authenticate.js:366:16)
    at authenticate (C:\Users\Dell Vostro 3885\Documents\Programming\PersonalProjects\CalorieTracker\node_modules\passport\lib\middleware\authenticate.js:367:7)
    at C:\Users\Dell Vostro 3885\Documents\Programming\PersonalProjects\CalorieTracker\app.js:187:7
    at Layer.handle [as handle_request] (C:\Users\Dell Vostro 3885\Documents\Programming\PersonalProjects\CalorieTracker\node_modules\express\lib\router\layer.js:95:5)
    at next (C:\Users\Dell Vostro 3885\Documents\Programming\PersonalProjects\CalorieTracker\node_modules\express\lib\router\route.js:137:13)
    at Route.dispatch (C:\Users\Dell Vostro 3885\Documents\Programming\PersonalProjects\CalorieTracker\node_modules\express\lib\router\route.js:112:3)
    at Layer.handle [as handle_request] (C:\Users\Dell Vostro 3885\Documents\Programming\PersonalProjects\CalorieTracker\node_modules\express\lib\router\layer.js:95:5)
    at C:\Users\Dell Vostro 3885\Documents\Programming\PersonalProjects\CalorieTracker\node_modules\express\lib\router\index.js:281:22
    at Function.process_params (C:\Users\Dell Vostro 3885\Documents\Programming\PersonalProjects\CalorieTracker\node_modules\express\lib\router\index.js:335:12)
    at next (C:\Users\Dell Vostro 3885\Documents\Programming\PersonalProjects\CalorieTracker\node_modules\express\lib\router\index.js:275:10)
    at methodOverride (C:\Users\Dell Vostro 3885\Documents\Programming\PersonalProjects\CalorieTracker\node_modules\method-override\index.js:79:5)
    at Layer.handle [as handle_request] (C:\Users\Dell Vostro 3885\Documents\Programming\PersonalProjects\CalorieTracker\node_modules\express\lib\router\layer.js:95:5)
    at trim_prefix (C:\Users\Dell Vostro 3885\Documents\Programming\PersonalProjects\CalorieTracker\node_modules\express\lib\router\index.js:317:13)
    at C:\Users\Dell Vostro 3885\Documents\Programming\PersonalProjects\CalorieTracker\node_modules\express\lib\router\index.js:284:7
    at Function.process_params (C:\Users\Dell Vostro 3885\Documents\Programming\PersonalProjects\CalorieTracker\node_modules\express\lib\router\index.js:335:12)

1 Ответ

1 голос
/ 11 июля 2020

Если вы используете опцию passReqToCallback, паспорт ожидает, что req -объект будет передан в качестве первого аргумента в обратном вызове:

passport.use(new LocalStrategy({
    usernameField: 'email',
    passwordField: 'passwd',
    passReqToCallback: true,
  },
  function(req, username, password, done) {
    // request object is now first argument
    // ...
  }
));

См. this для получения дополнительной информации .

...