javascript Passport.Js本地策略“不是构造函数”错误

yzckvree  于 2023-04-10  发布在  Java
关注(0)|答案(1)|浏览(107)

我试图用passport.js为我的身份验证构建一个本地策略,它可以与社交登录一起使用,但由于某种原因,相同的代码导致“TypeError:passport_local_1.LocalStrategy不是构造函数“错误,当与本地策略一起使用时
local-auth.ts

import * as passport from 'passport';
import { LocalStrategy as Strategy } from 'passport-local';

import User, { UserDocument } from './models/User';
import bcrypt from 'bcrypt';

function setupLocal({ server }) {
  const verify = async (email, password, cb) => {
    try {
      const user = await User.findByCredentials(email, password);
      return cb(null, user);
    } catch (err) {
      return cb(null, false, {
        message: 'Invalid login credentials',
      });
    }
  };

  passport.use(new Strategy({ usernameField: 'email' }, verify));

  passport.serializeUser((user: UserDocument, cb) => {
    cb(null, user._id);
  });

  passport.deserializeUser((id, cb) => {
    User.findById(id, User.publicFields()).exec((err, user) => {
      cb(err, user);
    });
  });

  server.use(passport.session());

  server.use(passport.authenticate('session'));

  server.get('/login', (res) => {
    res.render('login');
  });

  server.post(
    '/login/password',
    passport.authenticate('local', {
      successRedirect: '/',
      failureRedirect: '/login',
    }),
  );

  server.get('/signup', (res) => {
    res.render('signup');
  });

  server.post('/signup', async (req, res, next) => {
    const saltRounds = 10;
    try {
      const hashedPassword = await bcrypt.hash(req.body.password, saltRounds);
      const user = new User({
        email: req.body.email,
        password: hashedPassword,
      });
      await user.save();
      req.login(user, (err) => {
        if (err) {
          return next(err);
        }
        res.redirect('/');
      });
    } catch (err) {
      return next(err);
    }
  });

  server.post('/logout', (req, res, next) => {
    req.logout((err) => {
      if (err) {
        return next(err);
      }
      res.redirect('/');
    });
  });
}

export { setupLocal };

我在谷歌认证中有相同的导入

import * as passport from 'passport';
import { OAuth2Strategy as Strategy } from 'passport-google-oauth';

和类似的外观验证功能和使用在谷歌认证

passport.use(
    new Strategy(
      {
        clientID: process.env.GOOGLE_CLIENTID,
        clientSecret: process.env.GOOGLE_CLIENTSECRET,
        callbackURL: `${dev ? process.env.URL_API : process.env.PRODUCTION_URL_API}/oauth2callback`,
        passReqToCallback: true,
      },
      verify,
    ),
  );

调用设置函数

setupGoogle({ server });
setupLocal({ server });
nbysray5

nbysray51#

出于某种原因,它需要像这样导入:

import * as passport from 'passport';
import { Strategy } from 'passport-local';

相关问题