簡體   English   中英

Passport JS 無法讀取未定義的屬性(讀取“初始化”)

[英]Passport JS Cannot read properties of undefined (reading 'initialize')

在實現 Passport.js 進行身份驗證時遇到錯誤。 會話集合對其進行了數據解析,但是,我收到此錯誤:

TypeError: Cannot read properties of undefined (reading 'initialize')
    at Authenticator.initialize (\server\node_modules\passport\lib\authenticator.js:130:26)
    at Layer.handle [as handle_request] (\server\node_modules\express\lib\router\layer.js:95:5)
    at trim_prefix (\server\node_modules\express\lib\router\index.js:317:13)
    at \server\node_modules\express\lib\router\index.js:284:7    
    at Function.process_params (\server\node_modules\express\lib\router\index.js:335:12)
    at next (\server\node_modules\express\lib\router\index.js:275:10)
    at session (\server\node_modules\express-session\index.js:479:7)
    at Layer.handle [as handle_request] (\server\node_modules\express\lib\router\layer.js:95:5)
    at trim_prefix (\server\node_modules\express\lib\router\index.js:317:13)
    at \server\node_modules\express\lib\router\index.js:284:7 

我的 index.js 文件包含以下內容:

// Route Variables
const loginRoute = require("./routes/api/login");

/*
    ==MIDDLEWARE==
*/
// Express Parsing Middleware
app.use(express.json());
app.use(express.urlencoded({ extended: true }));

// Passport Auth Middleware
require("./config/passport");

/*
    ==SESSION SETUP==
*/

const sessionStore = MongoStore.create({
  mongoUrl: process.env.MONGO_URL,
});

app.use(
  session({
    secret: process.env.SECRET,
    resave: false,
    saveUninitialized: true,
    store: sessionStore,
    cookie: {
      maxAge: 1000 * 60 * 60 * 24,
    },
  })
);

// Initialize Passport and Use Session for Serialize/Deserialization
app.use(passport.initialize);
app.use(passport.session());

/*
    ==ROUTES==
*/
// User Route
app.use("/api", loginRoute);

當路由到/api/login ,登錄文件包含以下內容:

const router = require("express").Router();
var passport = require("passport");

router.post(
  "/login",
  passport.authenticate("local", {
    failureRedirect: "/login",
    successRedirect: "/dashboard",
  })
);

module.exports = router;

最后,我的護照中間件文件:

const passport = require("passport");
const LocalStrategy = require("passport-local").Strategy;
const bcrypt = require("bcrypt");
const User = require("../models/User");

const verifyCallback = (username, password, done) => {
  User.findOne({ username: username })
    .then((user) => {
      if (!user) {
        return done(null, false);
      }

      // Validate Password
      bcrypt.compare(password, user.password).then((isMatch) => {
        if (isMatch) {
          return cb(null, user);
        } else {
          return cb(null, false);
        }
      });
    })
    .catch((err) => {
      done(err);
    });
};

const strategy = new LocalStrategy(verifyCallback);

passport.use(strategy);

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

passport.deserializeUser((userId, done) => {
  User.findById(userId)
    .then((user) => {
      done(null, user);
    })
    .catch((err) => done(err));
});

這似乎是我不知道它來自哪里或命中的錯誤之一。 它只會在點擊我的登錄表單的提交按鈕時拋出並出錯。 除此之外,它初始化得很好。 我查看了passport.js 文檔,一切都井井有條。

我的前端在點擊提交按鈕時調用這個函數:

const handleOnSubmit = (e) => {
    e.preventDefault();

    login(data)
      .then((response) => {
        toast.success(response.data.message);
        setData({ username: "", password: "" });
        navigate("/dashboard");
      })
      .catch((err) => {
        if (err.response) {
          toast.error(err.response.data.message);
        } else if (err.request) {
          toast.error(err.request);
        } else {
          toast.error(err.message);
        }
      });
  };

並從我前端的 loginAPI.js 文件調用登錄函數,其中包含以下內容:


const instance = axios.create({
  baseURL: "http://localhost:8000/api/",
  timeout: 1000,
});

export async function login(data) {
  if (!data.username || !data.password) {
    return Promise.reject(new Error("Data is missing"));
  }

  return await instance.post("/login", data);
}

問題出在index.js中的這一行:

app.use(passport.initialize);

您應該調用 function initialize()不是property initialize 像這樣改變你的代碼:

app.use(passport.initialize());

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM